← 返回首页
servlet操作cookie
发表时间:2023-12-27 16:24:40
servlet操作cookie

在 Servlet 中提供了 Cookie 对象与 HttpSession 对象用于维护客户端 与服务端的会话状态的维持。与HttpSession不同的是Cookie是通过客户端浏览器实现会话的维持,而 HttpSession 是通过服务端来实现会话状态的维持。

1.cookie的特点

2.servlet创建cookie

注意Cookie是服务器端创建并返回给客户端的。最终是通过HttpServletResponse对象将Cookie写回给客户端浏览器。

Cookie cookie = new Cookie("key","value")
//通过 new 关键字创建 Cookie 对象
response.addCookie(cookie);

3.获取cookie的值

浏览器每次请求时都会把与当前访问的域名相关的 Cookie 在请求中提交到服务端。通过 HttpServletRequest 对象获取 Cookie ,返回Cookie数组。

//从客户端获取Cookie对象
Cookie[] cookies=req.getCookies();

//获取Cookie中的数据
PrintWriter pw=resp.getWriter();
for (int i=0;i<cookies.length;i++){
     Cookie cookie=cookies[i];
     String name=cookie.getName();
     String value=cookie.getValue();
    pw.println("Key: "+name+" Value: "+value);
}

解决Cookie不支持中文的问题。

在Cookie中key的值不能使用中文, Value 是可以的。但是在Servlet4.0 版本之前Cookie中的Value也是不支持中文存储的,如果存储的数据中含有中文,代码会直接出现异常。我们可以通过对含 有中文的数据重新进行编码来解决该问题。在 Servlet4.0 中的Cookie的Value开始支持中文存储。

还是建议使用URLEncoder.encode和URLDecoder.decode做编码和解码的处理,因为这样普适性较高,不用担心版本问题。

注意:强烈建议key不要使用中文字符串。和HashMap一样,只要是key一律使用英文字符串。

//创建Cookie对象
Cookie cookie=new Cookie("currentUsername", URLEncoder.encode("张三丰","utf-8"));
...


//获取Cookie中的数据
PrintWriter pw=resp.getWriter();
for (int i=0;i<cookies.length;i++){
     Cookie cookie=cookies[i];
     String name=cookie.getName();
     String value=cookie.getValue();
     pw.println("Key: "+name+" Value: "+URLDecoder.decode(value,"utf-8"));
}

4.状态Cookie与持久化Cookie

当Cookie对象创建后默认为会话级Cookie。可以使用 Cookie 对象下的cookie.setMaxAge(60) 方法设置失效时间,单位为秒。一旦设置了失效时间,那么该Cookie变为持久化Cookie ,浏览器会将Cookie对象 持久化到磁盘中。当失效时间到达后文件删除。

//创建Cookie对象
Cookie cookie=new Cookie("currentUsername", URLEncoder.encode("张三丰","utf-8"));

//变为持久化cookie,生存时间是3600s,在生存时间内关闭浏览器没问题
cookie.setMaxAge(3600);

5.HttpOnly

将cookie设置成HttpOnly是为了防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。如果设置为true,通过js等将无法读取到cookie,能有效的防止XSS攻击。

Java Ee 6.0中的cookie已经设置了httponly,所以如果兼容Java EE 6.0兼容的容器(例如Tomcat 7),可以使用cookie.sethttponly设置HttpOnly。

cookie.setHttpOnly(true);

另外一种办法,就是利用HttpResponse的addHeader方法,设置Set-Cookie的值。 cookie字符串的格式:key=value; Expires=date; Path=path; Domain=domain; Secure; HttpOnly

//设置cookie
response.addHeader("Set-Cookie", "uid=100; Path=/; HttpOnly");
//设置多个cookie
response.addHeader("Set-Cookie", "uid=100; Path=/; HttpOnly");
response.addHeader("Set-Cookie", "role=admin; Path=/; HttpOnly");
//设置https的cookie
response.addHeader("Set-Cookie", "uid=100; Path=/; Secure; HttpOnly");

6.Cookie跨域问题

域名分类:域名分为顶级域、顶级域名(一级域名)、二级域名。

域名等级的区别:一级域名比二级域名更高级,二级域名是依附于一级域名之下的附属分区域名,即二级域名是一级域名的细化分 级。例如: baidu.com 为一级域名, news.baidu.com 为二级域 名。 Cookie不支持一级域名的跨域,支持二级域名的跨域。一级域名(即顶级域名)需要申请,二级域名不需要申请,二级域名自己扩展即可。