ホームページ  >  記事  >  ウェブフロントエンド  >  Cookie を無効にし、ブラウザを閉じた後にセッションと Cookie が破棄される問題を解決する方法

Cookie を無効にし、ブラウザを閉じた後にセッションと Cookie が破棄される問題を解決する方法

零下一度
零下一度オリジナル
2017-05-18 11:54:545666ブラウズ

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

session メカニズムが引き続き使用できるようにします。セッション メカニズムはサーバー側のメカニズムであり、サーバーは情報を保存するためにハッシュ テーブルに似た構造を使用します (またはハッシュ テーブルを使用する場合もあります)。

プログラムがクライアントのリクエストに対してセッションを作成する必要がある場合、サーバーはまずクライアントのリクエストにセッション識別子 (セッション ID と呼ばれます) が既に含まれているかどうかを確認します。含まれている場合は、そのリクエストが以前にこのクライアント用に作成されたことを意味します。セッションを渡した後、サーバーはセッション ID に従ってセッションを取得し、それを使用します (取得できない場合は、新しいセッションが作成されます)。クライアント リクエストにセッション ID が含まれていない場合は、セッションが作成されます。クライアントに対して、セッション ID に関連付けられたセッションが生成される場合、セッション ID の値は、反復的ではなく、模倣するパターンが簡単に見つからない

string である必要があります。このセッション ID はクライアントに返されます。この応答に保存されます。 このセッション ID を保存する方法には Cookie を使用できるため、対話プロセス中にブラウザはルールに従ってこの ID をサーバーに自動的に表示できます。通常、この Cookie の名前は SEEESIONID に似ています。ただし、Cookie は人為的に無効にすることができるため、Cookie が無効になっている場合でもセッション ID をサーバーに戻す他のメカニズムが必要です。 頻繁に使用される手法は URL 書き換えと呼ばれ、URL パスの末尾にセッション ID を直接追加します。フォーム隠しフィールドと呼ばれる手法もあります。つまり、サーバーは自動的にフォームを変更し、非表示フィールドを追加して、フォームの送信時にセッション 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=&#39;"+url1+"&#39;>购买  </a>");
        out.println("<a href=&#39;"+url2+"&#39;>结账</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が含まれません。

【関連おすすめ】


1.

Js Cookieの操作(設定、読み込み、削除)例を詳しく解説

2. Cookieとは何ですか? Cookieは何に使用されますか?

以上がCookie を無効にし、ブラウザを閉じた後にセッションと Cookie が破棄される問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。