Cookie:
cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件,例如用户密码、用户账户等等,服务器是可以获取到cookie的内容的;而session则是存储在服务器端,通过唯一的session_id来区别用户,用于保存用户的登录状态和请求等,客户是不能获取到其内容的。。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。
要注意到cookie的名称是无法修改的,同时cookie并不提供修改和删除的操作,如果说要修改cookie 的内容,则可以新建一个同名的cookie覆盖掉原来的即可;要删除cookie的话则新建一个同名的cookie,并设置其maxAge为0即可。
需要考虑cookie中maxAge的一些特殊值所代表的含义,如果maxAge为负值,则表示cookie仅仅在当前浏览器窗口以及其打开的子窗口中有效,关闭时则失效,这也是cookie的默认maxAge值;如果maxAge为0,则说明删除该cookie,由于并没有删除cookie的操作,这里是需要通过cookie的maxAge来进行删除操作的。
核心代码
Cookie cookie = new Cookie(name,value);//创建cookie
cookie.setMaxAge(秒);//设置有效期
cookie.setPath(有效路径);//设置有效路径
response.addCookie(cookie);//将cookie响应给客户端浏览器去存储
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建Cookie并存储了数据
//cookie特点
// 只能存储string字符串,一个cookie只能存储一对key和value
// 存储在客户端浏览器的小文件
// 如果cookie没有设置有效期,默认有效期就是浏览器关闭,默认也不会产生缓存的文件
//疑问:cookie技术运行原理,每次请求服务器端都携带着cookie,有没有这个必要,所有的服务器端都需要读取这个数据吗?
// 并不是所有的服务器端资源都要读取cookie数据的,可以通过设置有效路径解决
// 默认情况:服务器端产生数据,客户端存储数据,每次请求服务器cookie都会带到服务器
Cookie cookie = new Cookie("username", "admin");
//设置有效期
cookie.setMaxAge(60*60*24*7);//单位:秒,7天
//需求:只让GetCookieDataServlet读取,别的资源不能读取
cookie.setPath("/Mylo");//只允许/day38/getCookieData这个路径读取,别的资源无法读取;如果没有设置这个值,默认值就是/day38
//cookie的数据响应给浏览器
response.addCookie(cookie);
}
读取Cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("username")){
response.getWriter().write(cookie.getValue());
break;
}
}
}
删除cookie
只要创建名称与有效路径一模一样的cookie对象,设置有效期为0就可以了