Cookie與 Session,一般認為是兩個獨立的東西,Session採用的是在伺服器端保持狀態的方案,而Cookie採用的是在客戶端保持狀態的方案。但為什麼禁用Cookie就不能得到Session呢?因為Session是用Session ID來確定目前對話所對應的伺服器Session,而Session ID是透過Cookie來傳遞的,禁用Cookie相當於失去了Session ID,也就得不到Session了。
如何停用cookie?
1、啟動IE;
2、在“工具”選單上,點選“Internet選項”,開啟“Internet選項”對話框;
3、點選“隱私”選項卡,將滑塊上移到更高的隱私等級。如果移動到最頂端則是選擇“封鎖所有的Cookie”,此時系統將阻止所有網站的Cookie,而且網站無法讀取電腦上已有的Cookie;
4、按一下「確定」按鈕。
sessionid是儲存在cookie中的,解決方案如下:
Session URL重寫,保證在客戶端停用或不支援COOKIE時,仍然可以使用Session
session機制。 session機制是一種伺服器端的機制,伺服器使用一種類似散列表的結構(也可能就是使用散列表)來保存資訊。
當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識(稱為session id),如果已包含則表示以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且產生一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將會被在本次回應中傳回給客戶端保存。 儲存這個session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個識別發揮給伺服器。一般這個cookie的名字都是類似 SEEESIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把session id傳回伺服器。 常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。還有一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,新增一個隱藏字段,以便在表單提交時能夠把session id傳回伺服器。
【URL重寫的範例】
package session;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class WelcomeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); request.getSession(); String url1 = response.encodeURL("/Session/servlet/SessionDemo1");//禁用cookie才重写,注意禁用cookie后,访问要用127.0.0.1,不能用localhost String url2 = response.encodeURL("/Session/servlet/SessionDemo2"); //禁用cookie之后无法解决关闭浏览器能重新访问的问题。 out.println("<a href='"+url1+"'>购买 </a>"); out.println("<a href='"+url2+"'>结账</a>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package session;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;//购买 index.jsp index.html//session基于cookiepublic class SessionDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); //Session创建 //request.getSession(false); //不创建session,只获取session 例如:显示购物车 //解决浏览器关闭后cookie销毁的问题: String sessionid = session.getId(); Cookie cookie = new Cookie("JSESSIONID",sessionid); cookie.setPath("/Session"); cookie.setMaxAge(30*60); response.addCookie(cookie); session.setAttribute("name", "洗衣机"); //30分钟没使用之后(不管有无关闭浏览器),Session才销毁(默认,可控制时间) //配置方法:在web.xml文件中配置<session-config>里面配置一个<session-timeout>并且设置时间值 //代码摧毁方法:session.invalidate(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ----------//解决浏览器关闭后session销毁的问题:String sessionid = session.getId(); Cookie cookie = new Cookie("JSESSIONID",sessionid); cookie.setPath("/Session"); cookie.setMaxAge(30*60); response.addCookie(cookie); 【解决浏览器关闭后session销毁的原因】: sessionId是一个cookie,max-age默认为-1,即关闭浏览器后sessionId就会清空 sessionId(cookie)清空后,自然就无法找到对应的session,所以session就失效了 【解决方法】: 设置上述代码,添加cookie的失效时间, 30分钟没使用之后(不管有无关闭浏览器),Session才销毁(默认,可控制时间) 其他session失效时间配置方法:在web.xml文件中配置<session-config>里面配置一个<session-timeout>并且设置时间值 代码摧毁方法:session.invalidate(); ----------package session;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;//结账public class SessionDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); String product = (String)session.getAttribute("name"); out.write("你购买的商品是:"+product); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
URL位址重寫是對客戶端不支援Cookie的解決方案。 URL位址重寫的原理是將該使用者Session的id資訊重寫到URL位址中。伺服器能夠解析重寫後的URL取得Session的id。這樣即使客戶端不支援Cookie,也可以使用Session來記錄使用者狀態。 HttpServletResponse類別提供了encodeURL(String url)實作URL位址重寫,該方法會自動判斷客戶端是否支援Cookie。如果客戶端支援Cookie,會將URL原封不動地輸出來。如果客戶端不支援Cookie,則會將使用者Session的id重寫到URL中。
注意:TOMCAT判斷客戶端瀏覽器是否支援餅乾的依據是請求中是否含有曲奇儘管客戶端可能會支援餅乾,但是由於第一次請求時不會攜帶任何曲奇(因為沒有任何的Cookie可以攜帶), URL位址重寫後的位址中仍會帶有JSESSIONID。當第二次訪問時伺服器已經在瀏覽器中寫入Cookie的了,因此URL位址重寫後的位址中就不會帶有JSESSIONID了。
【相關建議】
以上是如何停用cookie及解決瀏覽器關閉後session、cookie銷毀的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!