Maison  >  Article  >  interface Web  >  Comment désactiver les cookies et résoudre le problème de session et de destruction des cookies après la fermeture du navigateur

Comment désactiver les cookies et résoudre le problème de session et de destruction des cookies après la fermeture du navigateur

零下一度
零下一度original
2017-05-18 11:54:545584parcourir

Cookie et Session sont généralement considérés comme deux choses indépendantes. Session utilise une solution qui maintient l'état côté serveur, tandis que Cookie utilise une solution qui maintient l'état côté client. Mais pourquoi ne puis-je pas accéder à la session si je désactive les cookies ? Étant donné que la session utilise l'ID de session pour déterminer la session du serveur correspondant à la conversation en cours et que l'ID de session est transmis via Cookie, la désactivation de Cookie équivaut à perdre l'ID de session, et donc la session est perdue.

Comment désactiver les cookies ?

1. Démarrez IE ;
2. Dans le menu "Outils", cliquez sur "Options Internet" pour ouvrir la boîte de dialogue "Options Internet"
3. Cliquez sur "Confidentialité" ; " et déplacez le curseur vers un niveau de confidentialité plus élevé. Si vous vous déplacez vers le haut, sélectionnez « Bloquer tous les cookies ». À ce stade, le système bloquera les cookies de tous les sites Web et les sites Web ne pourront pas lire les cookies existants sur votre ordinateur
 4. Cliquez sur le bouton « OK ».

sessionid est stocké dans un cookie, la solution est la suivante :
Session Réécriture d'URL pour garantir que lorsque le client désactive ou ne prend pas en charge COOKIE, il Vous pouvez toujours utiliser le mécanisme de session Session

. Le mécanisme de session est un mécanisme côté serveur. Le serveur utilise une structure similaire à une table de hachage (ou peut utiliser une table de hachage) pour enregistrer les informations.

Lorsque le programme doit créer une session pour la demande d'un client, le serveur vérifie d'abord si la demande du client contient déjà un identifiant de session (appelé identifiant de session). Si c'est le cas, cela signifie qu'il a déjà été créé. . Ce client a créé une session et le serveur récupérera la session en fonction de l'identifiant de session et l'utilisera (s'il ne peut pas être récupéré, il en créera une nouvelle. Si la demande du client n'inclut pas l'identifiant de session, un). session sera créée pour le client et une session avec cela sera générée. L'identifiant de session associé à la session doit être une chaîne qui ne sera pas répétée et ne peut pas être facilement trouvée. et copié. Cet identifiant de session sera renvoyé au client dans cette réponse. La méthode de sauvegarde de cet identifiant de session peut utiliser des cookies, de sorte que pendant le processus d'interaction, le navigateur puisse afficher automatiquement cette identification au serveur selon les règles. Généralement, le nom de ce cookie est similaire à SEEESIONID. Mais les cookies peuvent être artificiellement désactivés, et il doit exister d'autres mécanismes pour toujours transmettre l'identifiant de session au serveur lorsque les cookies sont désactivés. Une technique fréquemment utilisée est appelée réécriture d'URL, qui ajoute l'identifiant de session directement à la fin du chemin de l'URL. Il existe également une technique appelée formulaire de champs cachés. Autrement dit, le serveur modifiera automatiquement le formulaire et ajoutera un champ masqué afin que l'identifiant de session puisse être renvoyé au serveur lorsque le formulaire est soumis.

【Exemple de réécriture d'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);
    }

}

La réécriture d'adresse URL est une solution pour les clients qui ne prennent pas en charge les cookies. Le principe de la réécriture d'adresse URL est de réécrire les informations d'ID de session de l'utilisateur dans l'adresse URL. Le serveur peut analyser l'URL réécrite pour obtenir l'ID de session. De cette manière, même si le client ne prend pas en charge les cookies, Session peut être utilisée pour enregistrer le statut de l'utilisateur. La classe HttpServletResponse fournit encodeURL (String url) pour implémenter la réécriture d'adresse URL. Cette méthode déterminera automatiquement si le client prend en charge les cookies. Si le client prend en charge les cookies, l'URL sera affichée intacte. Si le client ne prend pas en charge les cookies, l'ID de session de l'utilisateur sera réécrit dans l'URL.

Remarque : TOMCAT détermine si le navigateur client prend en charge les cookies en fonction du fait que la requête contient des cookies. Bien que le client puisse prendre en charge les cookies, il ne transportera aucun cookie dans la première requête (car il n'y a pas de cookies à transporter), l'adresse URL après réécriture contiendra toujours JSESSIONID. Lors du deuxième accès, le serveur a déjà écrit le cookie dans le navigateur, donc l'adresse URL après réécriture ne contiendra pas JSESSIONID.

[Recommandations associées]


1.

Explication détaillée des exemples de fonctionnement des cookies Js (paramétrage, lecture, suppression)

2. Que sont les cookies ? A quoi servent les cookies ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn