ホームページ > 記事 > ウェブフロントエンド > Cookie を無効にし、ブラウザを閉じた後にセッションと Cookie が破棄される問題を解決する方法
Cookie とセッションは、一般に 2 つの独立したものであると考えられています。セッションはサーバー側で状態を維持するソリューションを使用し、Cookie はクライアント側で状態を維持するソリューションを使用します。しかし、Cookie を無効にするとセッションを取得できなくなるのはなぜでしょうか?セッションはセッション ID を使用して現在の会話に対応するサーバー セッションを決定し、セッション ID は Cookie を介して渡されるため、Cookie を無効にすることはセッション ID を失うことと同等であり、セッションを取得できなくなります。
Cookieを無効にするにはどうすればよいですか?
1. IEを起動します; 2. [ツール]メニューで、[インターネットオプション]をクリックして、[インターネットオプション]ダイアログボックスを開きます
3. [プライバシー]タブをクリックし、スライダーを上に移動します。プライバシーの。一番上に移動したら、「すべての Cookie をブロック」を選択します。この時点で、システムはすべての Web サイトからの Cookie をブロックし、Web サイトはコンピューター上の既存の Cookie を読み取ることができません。
4. 「OK」ボタンをクリックします。
sessionid は Cookie に保存されます。解決策は次のとおりです: セッション
URL 書き換え。クライアントが COOKIE を無効にするかサポートしていない場合でも、Session
【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 アドレス書き換えの原理は、ユーザーのセッション ID 情報を URL アドレスに書き換えることです。サーバーは、書き換えられた URL を解析してセッション ID を取得できます。このようにして、クライアントが Cookie をサポートしていない場合でも、Session を使用してユーザーのステータスを記録できます。 HttpServletResponse クラスは、URL アドレス書き換えを実装するための encodeURL (String url) を提供します。このメソッドは、クライアントが Cookie をサポートするかどうかを自動的に判断します。クライアントが Cookie をサポートしている場合、URL はそのまま出力されます。クライアントが Cookie をサポートしていない場合、ユーザーのセッション ID が URL に書き換えられます。
注: TOMCAT は、リクエストに Cookie が含まれているかどうかに基づいて、クライアントのブラウザが Cookie をサポートするかどうかを判断します。クライアントは Cookie をサポートする可能性がありますが、最初のリクエストでは Cookie を送信しません (送信できる Cookie がないため)。 )、書き換え後の URL アドレスには JSESSIONID が含まれたままになります。 2回目のアクセス時は、サーバーがブラウザにCookieを書き込んでいるため、書き換え後のURLアドレスにはJSESSIONIDが含まれません。
【関連おすすめ】Js Cookieの操作(設定、読み込み、削除)例を詳しく解説
2. Cookieとは何ですか? Cookieは何に使用されますか?
以上がCookie を無効にし、ブラウザを閉じた後にセッションと Cookie が破棄される問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。