Cookie处理

Cookie

javax.servlet.http.Cookie

Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。Java Servlet 显然支持 HTTP Cookie。

cookie是通过response的消息头发送到浏览器中(Set-Cookie:), 当发送给浏览器的cookie重名时会覆盖之前的cookie

识别返回用户包括三个步骤:

  1. 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
  2. 浏览器将这些信息存储在本地计算机上,以备将来使用。
  3. 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。

编码处理

Servlet Cookie 处理需要对中文进行编码与解码,但是是针对Tomcat8.0及8.0以下的版本,在Tomcat8.5及8.5以后的版本中已经解决了该问题!

HTTP协议中规定了请求信息和响应信息中不能包含中文数据!比如你提交的中文可能会变成这样%E5%BC%A0%E9%A3%9E%E9%A3%9E

将中文数据转成下面这种格式,叫做URL编码:

张飞飞 ---> URL编码 ---> %E5%BC%A0%E9%A3%9E%E9%A3%9E

将下面这种格式再次转回中文数据,叫做URL解码:

%E5%BC%A0%E9%A3%9E%E9%A3%9E ---> URL解码---> 张飞飞

当cookie中保存中文数据,将cookie添加到响应中时,会报一个500异常,如下:

解决方法如下:

  • 编码: 中文字符-->url编码

    String str = java.net.URLEncoder.encode("中文","UTF-8");
    
  • 解码: url编码-->中文字符

    String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8");
    

Cookie方法

修饰符,返回值 方法 说明
public String getName() 该方法返回 cookie 的名称。
名称在创建后不能改变。
public void setValue(String newValue) 该方法设置与 cookie 关联的值。
public String getValue() 该方法获取与 cookie 关联的值。
public void setMaxAge(int expiry) 该方法设置 cookie 过期的时间(以秒为单位)。
-1 表示 cookie 将一直持续下去
如果不设置,cookie 只会在浏览器内存
会话中持续有效。
public int getMaxAge() 该方法返回 cookie 的最大生存周期(以秒为单位)
默认情况下,-1 表示 cookie 将持续下去,
直到浏览器关闭。
public void setDomain(String pattern) 该方法设置 cookie 适用的域.(例如aarons.top)
public String getDomain() 该方法获取 cookie 适用的域.(例如aarons.top)
public void setPath(String uri) 该方法设置 cookie 适用的路径。如果您不指定路径,
与当前页面相同目录下的(包括子目录下的)
所有 URL 都会返回 cookie。
public String getPath() 该方法获取 cookie 适用的路径。
public void setSecure(boolean flag) 该方法设置布尔值,
表示 cookie 是否应该只在加密的
(即 SSL)连接上发送。
public void setComment(String purpose) 设置cookie的注释。该注释在浏览器向用户
呈现 cookie 时非常有用。
public String getComment() 获取 cookie 的注释,如果 cookie 没有注释则返回 null。

Servlet操作Cookie

// 创建Cookie对象
Cookie cookie = new Cookie("key","value");
// 设置 cookie 过期的时间(1天后失效)
cookie.setMaxAge(60*60*24);
// 把cookie添加到响应头
response.addCookie(cookie);

如果不使用setMaxAge(int expiry)设置Cookie, Cookie只会贮存在浏览器内存中, 当浏览器关闭后就会失效

请记住,无论是名字还是值,都不应该包含空格或以下任何字符:

[ ] ( ) = , " / ? @ : ;

要读取 Cookie,您需要通过调用 HttpServletRequestgetCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName()getValue() 方法来访问每个 cookie 和关联的值。

// 获取从浏览器发送过来的Cookie
Cookie[] cookies = request.getCookies();
// 遍历coolies, 并获取每一个cookie的name和value
for (Cookie cookie : cookies) {
    String name = cookie.getName();
    String value = cookie.getValue();
}

删除 Cookie 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:

  1. 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
  2. 使用 setMaxAge(0) 方法设置 cookie 的年龄为零,来删除现有的 cookie。
  3. 把这个 cookie 添加到响应头。

删除所有cookie:

注意, 浏览器在传输数据的时候, 只会把cookie的key和value传递到服务器, 如果有doman或者path参数, 删除之前要重新传入这些数据才能进行正常删除

// 读取浏览器发送过来的cookie
Cookie[] cookies = request.getCookies();
// 遍历所有cookie, 并设置所有的cookie的过期时间都设置为0
for (Cookie cookie : cookies) {
    cookie.setMaxAge(0);
    response.setCookie(cookie);
}

cookie工具API

public class CookieUtil {

    //1.新增cookie
    public static void addCookie(String name, String value, String path, String domain, int maxAge, HttpServletResponse response){
        //校验自己完成
        Cookie cookie = new Cookie(name,value);
        cookie.setPath(path);
        cookie.setDomain(domain);
        cookie.setMaxAge(maxAge);
        response.addCookie(cookie);
    }

    //2.删除Cookie   0  -1 可以用枚举类型优化一下
    public static void deleteCookie(String name, String path, String domain, HttpServletResponse response){
        //校验自己完成
        Cookie cookie = new Cookie(name,"");
        cookie.setPath(path);
        cookie.setDomain(domain);
        cookie.setMaxAge(0);    //后期维护使用枚举
        response.addCookie(cookie);
    }

    //3.根据Cookie的name属性获取Cookie对象
    public static Cookie getCookieByName(HttpServletRequest request,String name){
        Cookie[] cookies = request.getCookies();
        if(cookies !=null && cookies.length>0){
            for(Cookie cookie : cookies){
                if(name.equalsIgnoreCase(cookie.getName())){
                    return cookie;
                }
            }
        }
        return null;
    }
}
posted @ 2020-06-16 14:47  zpk-aaron  阅读(247)  评论(0编辑  收藏  举报