Avatar billede Slettet bruger
18. maj 2002 - 21:35 Der er 12 kommentarer og
1 løsning

Lidt problemmer med Session i Servlets

Jeg får følgende fejlmeddelse i en Servlet.

"java.lang.IllegalStateException: Cannot create a session after the response has been committed"

Hvis der mangler yderlige info så sig til, men jeg håber at det er nok
Avatar billede erikjacobsen Ekspert
18. maj 2002 - 21:45 #1
En session kræver at der bliver skrevet noget i HTTP headeren, og
du har sikkert allerede sendt noget af kroppen (dit HTML) afsted,
Det er lidt et gæt, for jeg synes ikke det plejer at give denne reaktion,
Avatar billede jakoba Nybegynder
18. maj 2002 - 21:46 #2
Sessions skal oprettes i headeren, det vil doge før der er sendt den mindste smule sideindhold.
Avatar billede jakoba Nybegynder
18. maj 2002 - 21:47 #3
Ups.  doge -> sige
Avatar billede Slettet bruger
18. maj 2002 - 22:15 #4
Jaa, men det i tænker på er det ikke JSP?
Lige p.t. er det ikke JSP, men servlets (ved godt det er det samme, men ved ikke helt hvordan jeg skal forklare forskellen :-) )
Avatar billede erikjacobsen Ekspert
18. maj 2002 - 22:27 #5
Forskellen er ens når det afvikles, da en JSP-side oversættes til en Servlet.

Men lidt kode - eller yderligere forklaring - er ønskværdig
Avatar billede soelvpil Nybegynder
18. maj 2002 - 23:33 #6
Et eller andet sted i din servlets service-metode (eller doGet-metode), har du et kald til request.getSession().

Dette kald kommer EFTER du allerede er begyndt at skrive html ud out.println("<html>"); o.s.v

hvis du flytter dit request.getSession() op allerøverst i din metode før det første kald til out, skulle poblemet være løst.
Avatar billede Slettet bruger
19. maj 2002 - 09:12 #7
soelvpil>> Det har jeg selv tjekket, det var oxo en af mine første tanker, men det var desværre ikke det.

Men jeg tror nok at jeg har fået lokaliseret fejlen, spørgsmålet er bare hvordan jeg får rettet den.

Fejlen opstår ved at jeg bruger følgende kode i en servlet:

"ButtomFrameBasket curBasket = new ButtomFrameBasket();
curBasket.doGet(request,response);"

Jeg kan godt kalde servletten ButtomFrameBasket, den kører oxo godt nok som den skal, MEN når jeg i ButtomFrameBasket så skriver:

"Basket curBasket = (Basket) request.getSession().getAttribut("curBasket");"
Smider den exception som jeg skrev i mit første indlæg.
Jeg har oxo prøvet med "forward()", men den smider nøjagtig samme exception.
Jeg må nok indrømme at jeg ikke aner hvordan jeg skal løse det problem :-(
Avatar billede soelvpil Nybegynder
19. maj 2002 - 10:02 #8
VIl det sige, at du har en servlet, hvis doGet-metode du er i gang med at eksekvere? Og inde i denne doGet-metode er der så et kald til doGet-metoden på en anden servlet?

Det kan være du så i den første servlet skriver noget til out? HVis du ikke gør det, er problemet formentlig den "uatoriserede" måde du inkluderer indhold fra andre servlets på.

Jeg vil foreslå, at du lægger et kald af request.getSession()ind tidligt i den første servlet. Det skal være før kaldet af din ButtonfRameBasket, og før der bliveer ksrevet til out, hvis du gør det.

Hvis det ikke hjælper, kan du prøve at erstatte dit kald til ButtonFrameBasket med

getServletConfig().getServletContext().getRequestDispatcher("urltilbuttonframebasket").include(request,response);
Avatar billede Slettet bruger
19. maj 2002 - 16:36 #9
soelvpil>> Du har ret i at det er den måde som jeg har lavet det på.
Jeg vil prøve den sidste først, det lyder som om det er den mest rigtige måde at gøre det på. Jeg får ikke tid til det før i aften, men det skal absolut afprøves :-)
Avatar billede Slettet bruger
20. maj 2002 - 14:52 #10
du har fået point Soelvpil selvom det ikke var det der var galt, men jeg har brugt din metode alligevel fordi det var den mest korrekte :-)
Det var min browser der blokerede for cookies. Lidt offtopic, kan man gøre noget ved det som programmør??
Avatar billede soelvpil Nybegynder
20. maj 2002 - 21:55 #11
Hmmmmm, det lyder lidt mystisk.

Jeg troede, at manglene cookiesupport i browseren blot betød, at serveren oprettede en ny session hver gang, fordi den ikke får en cookie tilbage.

Måden at styre sessioner på, hvis cookies ikke er understøttede er via metoden

response.encodeURL(String url);

d.v.s. alle links, actions på forms etc skal have urlerne manipulerede. Der vil typisk ske det, at metoden putter et sessionid ind i urlen. Har dog ikke selv prøvet det, men det er cistnok metoden der benyttes, hvis man f.eks. programmerer til mobiltelefoner.
Avatar billede Slettet bruger
20. maj 2002 - 22:02 #12
Det kan godt være at du har ret i, men det er min fejl. Jeg har ikke lavet så den opretter en ny session i hver servlet, jeg gør det kun én gang.

Den anden kender jeg faktisk ikke. Men understøtter de fleste browser ikke cookies?
Avatar billede soelvpil Nybegynder
22. maj 2002 - 18:28 #13
Jeg tror at alle browsere i dag understøtter cookies. Brugeren har dog som regel mulighed for at slå dem fra, hvilket nogle (få) vælger at gøre.
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