会话技术
会话
一次会话中包含多次请求和相应,浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止,会话结束
功能
再一次会话范围内的多次请求间共享数据
方式
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
Cookie
概念:
客户端会话技术,将数据保存到客户端
主要步骤:
- 创建Cookie对象,绑定数据
- new Cookie(String name,String value)
- 发送Cookie对象
- response.addCookie(Cookie cookie)
- 获取Cookie对象,拿到数据(getCookies方法获取全部Cookie并返回数组)
创建Cookie与发送
1 2 3 4 5 6 7 8 9 10 11 12 13
| @WebServlet("/CookieServlet") public class CookieServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie=new Cookie("msg","hello_world"); response.addCookie(cookie); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
|
接收Cookie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @WebServlet("/CookieServlet2") public class CookieServlet2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie[] cookies=request.getCookies(); if(cookies!=null){ for(Cookie cookie:cookies){ String name=cookie.getName(); String value=cookie.getValue(); System.out.println(name+" : "+value); } } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
|
实现原理
Cookie的发送是通过在客户端发送请求到服务器端的过程后,浏览器端在返回response时向响应头中添加set-cookie:name=value实现。Cookie的接收是通过客户端在向服务器端发送请求前向请求头中添加cookie:name=value来实现的。两个实现原理均是在遵循HTML协议的前提下所实现
注意事项
- 一次可以发送多个Cookie
- cookie在浏览器中默认情况下在浏览器关闭后被销毁(保存在浏览器内存而不是本地)
- 在发送cookie时可以进行持久化存储的操作,保证在一段时间内,无论浏览器是否关闭,cookie都有效(保存在本地文件中)
- Cookie.setMaxAge(int seconds)
- 传入正数表示保存到秒数
- 传入0表示删除本地对应cookie信息
- 传入负数表示在浏览器关闭后销毁cookie
- Tomcat8之前不能存储中文cookie,Tomcat8之后可以存储中文cookie
- 默认情况下,同一个Tomcat服务器部署的不同web项目之间的cookie是不能进行共享的。cookie共享范围,默认情况下为当前虚拟目录。可以通过setPath(String path)修改默认共享范围
- 在不同Tomcat服务器部署的web项目中cookie也是可以设置共享的,利用setDomain(String path):如果设置的一级域名相同,那么多个服务器之间的cookie可以共享(例如:setDomain(“.baidu.com”)可以保证百度贴吧和百度体育之间的cookie共享)
Cookie特点与作用
- 数据存储在客户端浏览器
- 浏览器对于cookie的大小以及同域名下cookie的数量都有限制
- 一般用来存储不太敏感的信息(例如在不登录的情况下,完成服务器对客户端身份的识别)
Cookie简单应用
判断用户是否为初次访问当前页面,如果是则告知用户初次访问,如果不是,则显示用户上一次访问页面的时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| package cn.ywrby.Cookie;
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date;
@WebServlet("/CookieDemo1") public class CookieDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); Cookie[] cookies=request.getCookies(); boolean flag=false; if(cookies!=null&&cookies.length>0) { for (Cookie cookie : cookies) { if (cookie.getName().equals("lastTime")) { String t1=cookie.getValue(); response.getWriter().write("<h1>欢迎再次访问,您上次访问时间是:"+t1+"</h1>"); Date date=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss"); String t2=sdf.format(date); cookie.setValue(t2); response.addCookie(cookie); flag=true; } } } if(!flag||cookies==null||cookies.length==0){ Date date=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss"); String t=sdf.format(date); Cookie cookie=new Cookie("lastTime",t); response.addCookie(cookie); response.getWriter().write("<h1>欢迎初次访问!</h1>"); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
|