• 关于设置了setMaxAge(0)而浏览器未成功删除Cookie的注意事项


    最近做了个系统,其中涉及到对Cookie的操作。当用户登录时,设置一些数据到Cookie中,用户登出系统的时候删除写入浏览器中的对应Cookie。
    问题就出在登出系统时,在firebug中看到需要删除的Cookie并没有删除掉。

    最后经过自己的debug,终于找到了问题的所在。

    直接上代码:


    登录时写Cookie:

    Java代码 
    1. public void setLoginIDCookie1(HttpServletResponse response, String value) { 
    2.         Cookie cookie = new Cookie(loginIdCookieKey, value); 
    3.         // 设置cookie的域,如果不设置该属性将不能够写入cookie 
    4.         if (!StringUtils.isBlank(domain)) { 
    5.             cookie.setDomain(domain); 
    6.         } 
    7.         // 设置cookie的路径,这个路径即改工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie的路径及其子路径可以访问 
    8.         if (!StringUtils.isBlank(path)) { 
    9.             cookie.setPath(path); 
    10.         } 
    11.         // 设置cookie的过期时间(单位秒) 
    12.         if (expiry > 0) { 
    13.             cookie.setMaxAge(expiry); 
    14.         } 
    15.         response.addCookie(cookie); 
    16.     } 
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. public void setLoginIDCookie1(HttpServletResponse response, String value) {  
    2.         Cookie cookie = new Cookie(loginIdCookieKey, value);  
    3.         // 设置cookie的域,如果不设置该属性将不能够写入cookie  
    4.         if (!StringUtils.isBlank(domain)) {  
    5.             cookie.setDomain(domain);  
    6.         }  
    7.         // 设置cookie的路径,这个路径即改工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie的路径及其子路径可以访问  
    8.         if (!StringUtils.isBlank(path)) {  
    9.             cookie.setPath(path);  
    10.         }  
    11.         // 设置cookie的过期时间(单位秒)  
    12.         if (expiry > 0) {  
    13.             cookie.setMaxAge(expiry);  
    14.         }  
    15.         response.addCookie(cookie);  
    16.     }  





    登出时,删除Cookie:

    Java代码 
    1. public void deleteLoginCookies(HttpServletRequest request, HttpServletResponse response) { 
    2.        Cookie[] cookies = request.getCookies(); 
    3.        if (cookies != null && cookies.length >0) { 
    4.            // 遍历浏览器发送到服务器端的所有Cookie,找到自己设置的Cookie 
    5.            for (Cookie cookie : cookies) { 
    6.                String cookieName = cookie.getName(); 
    7.                if (cookieName.equals(loginIdCookieKey)) { 
    8.                    // 设置Cookie立即失效 
    9.                    cookie.setMaxAge(0); 
    10.                    /**
    11.                     * 删除Cookie时,只设置maxAge=0将不能够从浏览器中删除cookie,
    12.                     * 因为一个Cookie应当属于一个path与domain,所以删除时,Cookie的这两个属性也必须设置。
    13.                     *
    14.                     * 误区:刚开始时,我没有发现客户端发送到服务器端的cookie的path与domain值为空这个问题。
    15.                     * 因为在登陆系统时,我设置了Cookie的path与domain属性的值,就误认为每次客户端请求时,都会把Cookie的
    16.                     * 这两个属性也提交到服务器端,但系统并没有把path与domain提交到服务器端(提交过来的只有Cookie的key,value值)。
    17.                     */ 
    18.                    // 重点是这里1,必须设置domain属性的值 
    19.                    cookie.setDomain(domain); 
    20.                    // 重点是这里2,必须设置path属性的值 
    21.                    cookie.setPath(path); 
    22.                    response.addCookie(cookie); 
    23.                } 
    24.            } 
    25.        } 
    26.    } 
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. public void deleteLoginCookies(HttpServletRequest request, HttpServletResponse response) {  
    2.        Cookie[] cookies = request.getCookies();  
    3.        if (cookies != null && cookies.length > 0) {  
    4.            // 遍历浏览器发送到服务器端的所有Cookie,找到自己设置的Cookie  
    5.            for (Cookie cookie : cookies) {  
    6.                String cookieName = cookie.getName();  
    7.                if (cookieName.equals(loginIdCookieKey)) {  
    8.                    // 设置Cookie立即失效  
    9.                    cookie.setMaxAge(0);  
    10.                    /** 
    11.                     * 删除Cookie时,只设置maxAge=0将不能够从浏览器中删除cookie, 
    12.                     * 因为一个Cookie应当属于一个path与domain,所以删除时,Cookie的这两个属性也必须设置。 
    13.                     *  
    14.                     * 误区:刚开始时,我没有发现客户端发送到服务器端的cookie的path与domain值为空这个问题。 
    15.                     * 因为在登陆系统时,我设置了Cookie的path与domain属性的值,就误认为每次客户端请求时,都会把Cookie的 
    16.                     * 这两个属性也提交到服务器端,但系统并没有把path与domain提交到服务器端(提交过来的只有Cookie的key,value值)。 
    17.                     */  
    18.                    // 重点是这里1,必须设置domain属性的值  
    19.                    cookie.setDomain(domain);  
    20.                    // 重点是这里2,必须设置path属性的值  
    21.                    cookie.setPath(path);  
    22.                    response.addCookie(cookie);  
    23.                }  
    24.            }  
    25.        }  
    26.    }  


  • 相关阅读:
    Ubuntu安装deepin wine版QQ
    解决anaconda安装cvxpy失败的方法
    1006
    一种不用参数交换两变量值的方法
    输入三位数,翻转输出
    一个简单的问题
    1006ac(转)
    1007(转)
    杭电oj1004 自写成功代码
    1004
  • 原文地址:https://www.cnblogs.com/keyi/p/6122845.html
Copyright © 2020-2023  润新知