1. 程式人生 > >使用URL重寫解決 Cookie被禁用,導致的使用者Session遺失

使用URL重寫解決 Cookie被禁用,導致的使用者Session遺失

大家都知道使用者和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() ));
    }
}