使用URL重寫解決 Cookie被禁用,導致的使用者Session遺失
阿新 • • 發佈:2019-02-01
大家都知道使用者和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丟失的"假象".
那麼客戶端是如何在伺服器上一下子找到屬於自己的那個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() )); } }