大家都知道使用者和web應用互動,通過Session的方式。
那麼用戶端是如何在伺服器上一下子找到屬于自己的那個Session呢?
一般情況下,用戶端是通過cookie 的方式找到伺服器上的Session的。
可以打開自己的浏覽器找到SESSIONID 這個cookie。裡面存放的就是使用者使用的Session。
那麼當使用者手動的禁用掉了Cookie呢?
那麼此時,會出現當使用者通路一個web應用多個頁面的時候,會出現遺失了Session的"假象".
其實使用者的Session還存在伺服器上,隻不過遺失了。
對于這種現象,JavaEE提供了解決方法。
就是采用URL重寫的方法,在請求位址之後加上;jsessionid=HttpSession對象的Id号
HttpSession session = req.getSession();
//調用這行代碼之前先調用以下上面一條代碼.
String path = resp.encodeRedirectURL("/world");
這兩行代碼可以彌補因為禁用Cookie而産生的使用者session丢失的"假象".
在粘貼上兩個Servlet的示範效果。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet(urlPatterns = "/hello")
public class MyServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
HttpSession session = req.getSession();
String path = resp.encodeRedirectURL( "/world" );
System.out.println( "jsessionId是:" + req.getSession().getId() );
String sessionId = req.getSession().getId();
req.setAttribute( "sessionId",sessionId );
resp.sendRedirect( path );
// req.getRequestDispatcher( "path" ).forward( req, resp );
}
}
==============================================================================================
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/world")
public class AnotherServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
System.out.println("跳躍到另一個Servlet的jsessionId是:" + req.getSession().getId());
// System.out.println("兩個Session相等麼" + req.getAttribute( "sessionId" ).equals( req.getSession().getId() ));
}
}