Servlet第五篇【Cookie】
会话技术
什么是会话?
答:从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。(浏览器没关,只关闭一个页面会话不算结束)
Cookie的属性
| 属性名 | 描述 |
|---|---|
| name | Cookie的名称,Cookie一旦创建,名称便不可更改 |
| value | Cookie的值,如果值为Unicode字符,需要为字符编码。如果为二进制数据,则需要使用BASE64编码 |
| maxAge | Cookie失效的时间,单位秒。如果为正整数,则该Cookie在maxAge秒后失效。如果为负整数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为-1。 |
| secure | 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。 |
| path | Cookie的使用路径。如果设置为“/sessionWeb/”,则只有该路径为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下的路径都可以访问该Cookie。 |
| domain | 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。 |
| comment | 该Cookie的用处说明,浏览器显示Cookie信息的时候显示该说明。 |
| version | Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范。 |
Cookie的基本使用
public class MyServletA extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
Cookie cookie = new Cookie("name", URLEncoder.encode("张三", "utf-8"));
cookie.setMaxAge(1000);
resp.getWriter().write("服务器返回了Cookie!");
resp.addCookie(cookie);
}
}
public class MyServletB extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("服务器拿到Cookie:");
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
String name = cookie.getName();
resp.getWriter().write(name + "------" + URLDecoder.decode(cookie.getValue(), "utf-8") + " ");
}
}
}
Cookie的有效期
通过setMaxAge(int expiry)进行设置
- expiry为正数,单位为秒,浏览器会把Cookie写到硬盘中,只要还在expiry秒之前,登陆网站时该Cookie就有效。
- expiry为负数,浏览器不会把Cookie写到硬盘中,Cookie是临时性的,关闭浏览器就失效,默认值为-1。
- expiry为0,相当于删除Cookie。Cookie机制没有提供删除Cookie对应的方法,把expiry设置为0等同于删除Cookie。
Cookie的方法
setPath(String uri),只有该资源路径才能获取Cookie
Cookie记录上次登录时间
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
Cookie[] cookies = req.getCookies();
if(cookies==null){
resp.getWriter().write("第一次访问!");
}else{
resp.getWriter().write("上次访问时间:");
for (Cookie cookie : cookies) {
if ("previousTime".equals(cookie.getName())) {
System.out.println(cookie.getValue());
resp.getWriter().write(URLDecoder.decode(cookie.getValue(),"utf-8"));
break;
}
}
}
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = simpleDateFormat.format(new Date());
String encode = URLEncoder.encode(time,"utf-8");
Cookie cookie=new Cookie("previousTime",encode);
resp.addCookie(cookie);
}
注意事项:
Cookie cookie=new Cookie(String name,String value)的name和value值不能包含中文,也不能包含特殊字符,比如英文分号(;)、英文逗号(,)、等号(=)、空格( )等。如果包含特殊符号,则会报500
如何包含中文或特殊字符呢?
解决方案:
方案:
设置Cookie时,先进行URLEncoder.encode(str,"utf-8"),获取Cookie时,再URLDecoder.decode(str,"utf-8")
设置Cookie的携带路径
子路径能访问到父路径设置的Cookie,但父路径无法访问到子路径设置的Cookie
说明:
localhost:8080/cookiepath/cookie的路径是"/cookiepath",localhost:8080/cookiepath/subcookiepath/cookie的路径是"/cookiepath/subcookiepath",前者对应的Servlet设置了Cookie,后者的Servlet是能获取到;反之,不能
设置JS禁止操作Cookie
public class CookieServlet extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
Cookie cookie=new Cookie("name","zhangsan");
//禁用JS操作Cookie
cookie.setHttpOnly(true);
response.addCookie(cookie);
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
this.doPost(request,response);
}
}

浙公网安备 33010602011771号