2011-01-25 128 views
1

我寫了一個簡單的servlet,我想測試,以便在刷新瀏覽器時保留舊會話。但是,它不是它每次刷新頁面時都會創建一個新的會話。是不是它應該只在關閉瀏覽器時創建一個新會話? 我正在使用ServletRunner而不是在Tomcat上運行它,這可能是問題嗎?如何保持Servlet會話?

import java.io.*; 

import javax.servlet.*; 
import javax.servlet.http.*; 

public class SessionPlay extends HttpServlet 
{ 
    public void doGet (HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException 
    { 

     resp.setContentType("text/html"); 

     //Get session object 
     HttpSession session = req.getSession(true); 

     String id = session.getId(); 


     PrintWriter out; 
     String title = "Session play"; 



     // then write the data of the response 
     out = resp.getWriter(); 

     out.println("<html><head><title>"); 
     out.println(title); 
     out.println(id); 
     out.println("</title></head><body>"); 
     out.println("<h1>" + title + "</h1>"); 

     if(session.isNew()) 
     { 
     out.println("<p>Welcome new comer</p>"); 
     out.println("<p>" + id + "</p>"); 
     } 
     else 
     { 
     out.println("<p>Welcome back</p>"); 
     out.println("<p>" + id + "</p>"); 
     } 

     out.println("<form action=SessionPlay method=get>"); 
     out.println("<input type=input name=param1>"); 
     out.println("<input type=submit>"); 
     out.println("</form>"); 

     out.println("</body></html>"); 
     out.close(); 

    } 
} 

回答

2

會話由cookies維護。當在服務器中創建新會話時,它將向客戶端應該在同一會話中的所有後續請求中發回的響應添加一個cookie。

但是,您顯然通過在瀏覽器中按F5或刷新按鈕刷新初始請求。初始請求不包含會話cookie。如果您在HTML中添加指向頁面本身的鏈接或者在同一站點上的其他頁面並單擊它,您將看到會話將保持不變。

解決此問題的方法之一是創建一個篩選器,在創建會話時執行重定向。


更新:餅乾是禁用的以及主機和上下文相關的。您需要確保在這兩個web服務器(例如,Tomcat <Context>沒有cookies="false")和webbrowser(某處設置)中啓用cookie,並且主機名不是內部網域(某些瀏覽器不允許裸主機名上的cookie),並且它是提交到相同的上下文(webapp上下文名稱)。有關如何調試cookie的提示,請參閱this answer


與問題無關,在servlet中發佈HTML並不是最佳實踐。這項工作是由JSP文件完成的。在完成所有必需的Java代碼操作後,使用RequestDispatcher#forward()將請求轉發到JSP文件。

+0

不是真的。在我上面的例子中,我有一個表單發送GET到同一頁面。然而,當再次到達同一頁面時,如果不用F5刷新,無論如何都會創建一個新的會話。 – starcorn 2011-01-25 14:15:42