天天看點

使用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() ));
    }
}