2010-06-21 44 views
0

我有一個處理登錄的servlet類。在我的登錄程序結束時,我這樣做:我在哪裏放置會話信息?在HttpServletRequest.setAttribute()?

// jsp page 
... 
Helper.loginUser(request); 

// Helper.java 
public static void loginUser(HttpServletRequest request) { 

    request.getSession().setAttribute("username", "john"); 
} 

爲了記住誰是用戶在頁面加載之間。在另一個servlet(處理ajax調用)中,我需要查看該會話是否對用戶有效。看起來像這樣:

// OtherServlet.java 
public void doPost(HttpServletRequest req, HttpServletResponse resp) { 
    String username = (String)req.getSession().getAttribute("username"); 
} 

但是獲取屬性總是返回null。我應該在哪裏存儲會話信息,以便我可以在不同的servlet之間進行恢復?

感謝

+0

什麼是你的servlets的URL?具體來說,URL是否具有相同的主機名? – Pointy 2010-06-21 21:42:49

+0

這是相同的域,這些網址就像[mysite.com/user/login]和[mysite.com/user/reports]。 – user246114 2010-06-21 21:44:18

回答

0

的會話綁定到特定的域,默認情況下也是上下文路徑。如果OtherServlet運行在不同的域和/或上下文中,則會得到完全不同的會話。

如果您想要在同一個域中的不同web應用程序上下文中共享會話,則需要相應地配置servletcontainer以將cookie路徑設置爲。例如,對於Tomcat,您可以通過在/conf/server.xml文件中將HTTP ConnectoremptySessionPath屬性設置爲true來實現。


更新,你的問題的複覈後,在JSP中Helper.loginUser(request)的做法是不是一個好的做法。您應該在Servlet類中完成此操作。順便說一句,這也可能是因爲響應標頭已經發送而導致servlet容器無法設置會話cookie的原因,但是您應該已經注意到了服務器日誌中的自我解釋IllegalStateException

爲了幫助你遠一點,這裏有一個正確的方式基本開球例如登錄的用戶:

HTML表單在JSP:這是映射到一個Servlet

<form action="login" method="post"> 
    <input type="text" name="username"> 
    <input type="password" name="password"> 
    <input type="submit"> 
</form> 

doPost()方法url-pattern of /login

String username = request.getParameter("username"); 
String password = request.getParameter("password"); 
User user = userDAO.find(username, password); 
if (user != null) { 
    request.getSession().setAttribute("user", user); // Login user. 
    response.sendRedirect("home"); // Redirect to home/succes page. 
} else { 
    request.setAttribute("error", "Unknown username/password, try again"); // Set error message. 
    request.getRequestDispatcher("login.jsp").forward(request, response); // Redisplay login.jsp. 
} 
+0

嗯,我不遵循不同的上下文部分 - 這些網址是相同的域名,例如[mysite.com/user/login]和[mysite.com/user/reports] ..我如何判斷上下文是否不同? – user246114 2010-06-21 21:45:12

+0

你最初告訴你有2個servlet,但是仔細檢查代碼後發現你是(ab)使用JSP將登錄用戶放入會話中。這並不總是奏效。檢查服務器日誌。我已經相應地更新了答案。 – BalusC 2010-06-21 21:46:29

+0

謝謝,這是一個很好的例子。我按照建議重寫了所有內容,現在它可以工作。 – user246114 2010-06-22 19:21:12