Avatar billede zamiel Nybegynder
22. februar 2008 - 10:28 Der er 8 kommentarer og
1 løsning

Problem med at skrive output med ServletResponse

Jeg er ved at implementere Jcaptcha i min servlet og får følgende fejl.

java.lang.IllegalStateException: strict servlet API: cannot call getWriter() after getOutputStream()

I API'en for servletresponse står der også at man kun kan kalde getWriter() eller getOutputResponse()

Men det gør koden da heller ikke..

ServletOutputStream responseOutputStream = this.getResponse().getOutputStream();
       
responseOutputStream.write(captchaChallengeAsJpeg);
responseOutputStream.flush();
responseOutputStream.close();

captchaChallengeAsJpeg er et byte array.

Det skulle undre mig at folkene bag jCaptcha skulle have overset denne fejl.. Er der nogen som kan fortælle mig hvorfor jeg får denne fejl og vigtigere endnu hvordan jeg kommer udenom den?
Avatar billede arne_v Ekspert
22. februar 2008 - 13:12 #1
Vi skal nok se lidt mere kode såsom hele doGet metoden.
Avatar billede zamiel Nybegynder
22. februar 2008 - 14:53 #2
Det er en BEA weblogic controller så koden ligger i en action..

protected Forward showPic()
    {
        byte[] captchaChallengeAsJpeg = null;
      // the output stream to render the captcha image as jpeg into
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        try {
        // get the session id that will identify the generated captcha.
        //the same id must be used to validate the response, the session id is a good candidate!
        String captchaId = this.getRequest().getSession().getId();
        // call the ImageCaptchaService getChallenge method
            BufferedImage challenge =
                    CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,this.getRequest().getLocale());
           
            // a jpeg encoder
            JPEGImageEncoder jpegEncoder =
                    JPEGCodec.createJPEGEncoder(jpegOutputStream);
            jpegEncoder.encode(challenge);
        } catch (IllegalArgumentException e) {
            //this.getRequest().sendError(HttpServletResponse.SC_NOT_FOUND);
           
        } catch (CaptchaServiceException e) {
            //this.getRequest().sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
           
        } catch (IOException ioe){
       
        }

        captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

        // flush it in the response
        this.getResponse().setHeader("Cache-Control", "no-store");
        this.getResponse().setHeader("Pragma", "no-cache");
        this.getResponse().setDateHeader("Expires", 0);
        this.getResponse().setContentType("image/jpeg");
        try{
       
        ServletOutputStream responseOutputStream = this.getResponse().getOutputStream();
       
        responseOutputStream.write(captchaChallengeAsJpeg);
        responseOutputStream.flush();
        responseOutputStream.close();
        }catch(IOException e){} 
             
       
        return new Forward("success");
    }


JSP koden der viser dette ser således ud..

<netui:image src="showPic.do" alt="" width="150" height="50" border="1"/>
Avatar billede arne_v Ekspert
24. februar 2008 - 00:50 #3
Forward ????

Hvad forwarder du til efter at have outputte JPEG'en ?

Den skal ikke forwarde til noget som helst.

Og absolut ikke noget der kalder response.getWriter !
Avatar billede zamiel Nybegynder
28. februar 2008 - 15:22 #4
Det er bare en autogeneret action som med default returnere en forward.. Den forwarder heller ikke da path for denne forward ikke er sat. Havde bare ikke lige rettet actionen til det da dette kun var for at prøve.

Selvom jeg får ovenstående fejl så viser bea controlleren alligevel captcha billedet på siden..

er response.getwriter og ServletOutputStream.write ens eller?
Avatar billede arne_v Ekspert
29. februar 2008 - 05:37 #5
En forward laver vel en forward uanset hvad. Og giver en fejl. Du kan stadig se billedet
fordi billedet er sendt når fejlen sker.

Du skal nok bruge noget andet end en sådan action til at sende billeder.
Avatar billede zamiel Nybegynder
29. februar 2008 - 20:12 #6
fair nok, men det virker da ikke som om det er det som giver ovenstående fejl..
Avatar billede arne_v Ekspert
01. marts 2008 - 00:13 #7
Fejl beskeden passwer perfekt med at der laves en forward efter at billedet
er skrevet.
Avatar billede zamiel Nybegynder
04. marts 2008 - 14:40 #8
aha true :) så mangler jeg bare et svar fra dig
Avatar billede arne_v Ekspert
04. marts 2008 - 15:00 #9
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester