**
Cookie
**
在了解什么是Cookie前,我们现介绍一下一个概念:一次会话。
一次会话:浏览器第一次给服务器资源发送请求,会话建立。直到有一方断开为止
两种会话技术:
客户端会话技术(Cookie)
服务器会话技术(Session)
Cookie是把数据保存到客户端的技术。
作用:
1.用于存储少量不敏感的数据
2.在用户不登陆的情况下,完成服务器对用户的身份识别
关于Cookie的一些细节:
1.可以创建多个Cookie对象发送给浏览器
2.默认情况下当浏览器关闭后,Cookie数据被销毁,而setMaxAge方法传递一个int参数:
正数代表了持久化存储,数字代表了Cookie在硬盘文件能存活多少秒(在这个时间内用其他浏览器请求某服务器也可以查看到Cookie)
负数(就是默认情况)
零代表使这个调用这个方法的Cookie对象无效化
3.在Tomcat8之后,Cookie才支持中文数据
4.若在一个Tomcat中部署了多个web项目,那么Cookie在默认情况下不可以在这些项目中共享
可以使用setPath方法传递一个更上级的目录,使得Cookie可以被共享
在简单介绍后,我们来看一下代码:
在这个Servlet中向浏览器发送一个Cookie
@WebServlet("/demo1")
public class Servlet_cookie1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie对象
Cookie c=new Cookie("msg","Hello");
//2.发送Cookie
response.addCookie(c);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
在这个Servlet中把Cookie内容获取
@WebServlet("/demo2")
public class Servlet_cookie2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3.获取Cookie
Cookie[] cs=request.getCookies();
//遍历
if(cs!=null){
for (Cookie c : cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
结果
JSESSIONID:CEC6CBE51C3F6C5510DE5E9326F74FE6
msg:Hello
Idea-765bc675:d223a34d-972b-4a03-8494-266e699b06f0
第一行和第三行不是我们设置的Cookie,不需要去管它。第二行是我们设置的Cookie的内容,成功的被获取了。
下面我们做一个小案例联系一下Cookie
需求:
若是第一次访问服务器,打印首次访问
若不是第一次访问服务器,显示上一次的访问时间
代码:
@WebServlet("/Servlet_cookie_case")
public class Servlet_cookie_case extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
boolean flag=false;
Cookie[] cs=request.getCookies();
if(cs!=null && cs.length>0){
for (Cookie c : cs) {
String name = c.getName();
if ("lastTime".equals(name)){//代表不是第一次访问,打印信息并且重设cookie的value
flag=true;
Date date=new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//这个格式里面有一个空格,属于特殊字符,要用URL来解码编码
String s = simpleDateFormat.format(date);
s= URLEncoder.encode(s,"utf-8");//编码
c.setValue(s);
c.setMaxAge(60*60);
response.addCookie(c);
String value=c.getValue();
value= URLDecoder.decode(value,"utf-8");//解码
response.getWriter().write("欢迎回来,上次访问时间为"+value);
break;
}
}
}
if(cs==null || cs.length==0 || flag==false ){
Date date=new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s = simpleDateFormat.format(date);
s= URLEncoder.encode(s,"utf-8");//编码
Cookie c=new Cookie("lastTime",s);
c.setMaxAge(60*60);
response.addCookie(c);
response.getWriter().write("欢迎首次访问");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
第一次访问:
第二次访问(我这里就是刷新了一下页面):
下次更新session会话技术。