2010-06-15 106 views
2

我剛開始研究Java Servlets和JSP,並對會話對象有些困惑。裏面一個servlet我有這樣的:JSP ::與會話對象混淆

現在
public class SampleServlet extends HttpServlet { 

    public void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws IOException { 

     HttpSession session = request.getSession(true); 
     session.setAttribute("_session", "_value"); 
       response.sendRedirect("page2.jsp");   
     } 
} 

,裏面page2.jsp,有一個會話對象爲好,但是當我做這個

<% 
out.print(session.getAttribute("_session")) 
%> 

它似乎並沒有得到值(就好像它沒有設置一樣)。我嘗試設置布爾屬性爲true,但在jsp頁面中返回false。有人能告訴我這樣做的正確方法嗎?至於我想做什麼,我想分享一些會話變量。

+0

您確認您的瀏覽器配置爲支持cookie?重定向返回到客戶端,然後返回到服務器。也許cookie丟失了。 – 2010-06-15 21:13:38

+0

你需要啓用cookie - 你確定你在做嗎? – OpenSource 2010-06-15 21:14:47

+0

@Eyal和@OpenSource:是的。我的瀏覽器支持cookies。我正在嘗試下面給出的一些建議。會回來。 – Legend 2010-06-15 21:21:09

回答

3

使用request.getRequestDispatcher()。forward()而不是response.sendRedirect();

所以,你的代碼是:

HttpSession session = request.getSession(true); 
session.setAttribute("_session", "_value"); 
request.getRequestDispatcher("page2.jsp").forward();  

基本上,response.sendRedirect是()不保留會話信息,所以當JSP得到它它不存在。 request.forward()確實保留了會話。

http://www.coderanch.com/t/170618/java-Web-Component-SCWCD/certification/sendRedirect-Vs-requestdispatcher-forward

+0

最後一行語法無效,他正在設置一個會話屬性,所以它應該在重定向的請求中。 – BalusC 2010-06-15 21:14:31

+0

糟糕,我把arg放在了錯誤的地方。更新 – 2010-06-15 21:17:09

+0

太棒了!謝謝...它現在可以工作了......但我必須將'forward'改爲'forward(request,response)'。 – Legend 2010-06-15 21:39:50

1

假設您的容器支持它,請使用EL

Java方面:

HttpSession session = request.getSession(true); 
session.setAttribute("foo", "bar"); 

JSP方:

<html> 
    ... 
    <body> 
     ... 
     <p>${foo}</p> 
     ... 
    </body> 
</html> 

這會給你包含字符串bar一個段落。

+1

沒有解釋原始問題,儘管... – skaffman 2010-06-15 21:16:27

+0

EL適用於+1。剛開始聽到一些Java端技術:) – Legend 2010-06-15 21:54:07

+0

@skaffman - 是原始問題(重定向不保留會話信息)GAE特定的?當我想通過使用JBoss + Tomcat保存重定向信息時,我實際上使用會話屬性(vs請求屬性)。 – 2010-06-16 13:51:08

1

雖然不是最好的方法(我寧願使用EL ${_session}小腳本),這應該能正常運行。你的問題在別的地方。你正在運行你認爲你正在運行的代碼嗎?你如何編譯和部署代碼?你是否從給定的例子中修剪得太少了?會話是依賴於域和上下文的,如果你重定向到不同的域和/或上下文,那麼將創建一個新的會話。此外,會話由cookie支持,瀏覽器是否啓用了Cookie?否則,您必須使用HttpServletResponse#encodeRedirectURL()將會話標識符附加到重定向URL。

response.sendRedirect(response.encodeRedirectURL("page2.jsp")); 

更新:調試,如果它是真的相同會話,請在servlet:

System.out.println("Session ID: " + session.getId()); 

,並在JSP:

<p>Session ID: ${pageContext.session.id}</p> 

而且安裝一個HTTP標頭跟蹤器,如FirebugNet面板可能會帶來新的見解。 HTTP響應應該包含帶有會話ID的Set-Cookie標頭,隨後的HTTP請求應包含具有相同cookie名稱/值的Cookie標頭,通常爲JSESSIONID,其長十六進制值與this screenshot相似。


更新2:,因爲我很驚訝,因爲正向顯然修正了這個問題,我試圖重現這個在Tomcat 6和Glassfish 3,但這種方法的作品完美的兩臺服務器上。所以我懷疑Appengine使用的容器中存在一個錯誤,即它在重定向過程中沒有正確設置cookie。

作爲證據,下面是這證明GlassFish是由Set-Cookie設置cookie由Location發射重定向的屏幕:

alt text

+0

我正在使用Google App Engine框架。在Eclipse創建的項目內寫入一些servlet和jsp文件。 – Legend 2010-06-15 21:17:52

+0

剛剛嘗試過你的方法。它似乎行爲一樣。 – Legend 2010-06-15 21:23:49

+1

+1爲您的時間。 – Legend 2010-06-15 21:53:32