会话技术(Cookie和Session )
1. 会话
浏览器第一次给服务器发起请求,就建立一次会话,直到一方断开连接为止。
2.会话功能
在一次会话范围内的多次请求之间共享数据
3.会话技术的分类
-
客户端会话技术:Cookie,将数据保存到客户端
-
使用的步骤:
- 创建Cookie对象,绑定数据
- new Cookie(String name, String value)
- 发送Cookie对象
- response.addCookie(Cookie cookie)
- 获取Cookie对象,获取数据
- Cookie[] request.getCookies():获取所有的Cookie
- 创建Cookie对象,绑定数据
-
cookie原理:
这是基于响应头Set-Cookie和请求头Cookie实现的。
- 在ServletA里发送Cookie对象,在响应消息里设置响应头
Set-Cookie: message=helloWorld
,发送给浏览器,浏览器获得该响应消息,保存该信息 - 在同一次会话的不同请求下,浏览器的下次请求,会在请求信息的请求头里包含
Cookie: message=helloWorld;
,发送给服务器。 - 在ServletB里获取Cookie对象,便可以获取该信息
- 在ServletA里发送Cookie对象,在响应消息里设置响应头
-
Cookie的一些细节
- 可以创建、发送多个Cookie
- Cookie的存活时间
- 默认情况下,浏览器关闭后Cookie数据就被销毁
- 可以使用Cookie对象的方法
setMaxAge(int second)
设置存活时间,进行持久化处理- second为正数,表示持久化,second秒后才删除数据
- second为负数,表示关闭浏览器就销毁cookie数据,这是默认值
- second为0,表示删除该cookie数据
- Cookie存储中文数据
- 在Tomcat8之后就可以直接存储中文数据了
- Cookie的共享范围
- 在Tomcat服务器中,一个服务器里部署了多个web项目
- 默认情况下是不能共享的
- 共享范围可以用Cookie对象的方法
setPath(String path)
来设置,默认情况下就是当前项目。如果需要多个项目共享该Cookie对象,就可以设置为setPath("/")
表示当前项目的根路径下的所有项目共享
- 其实哪怕在不同的服务器的之间,cookie也是也可共享的
- setDomain("string path"):如果设置相同的一级域名,那么多个服务器之间可以共享cookie:比如setDomain(".alibaba.com"),表示在任何
xxx.alibaba.com
之间的项目都可共享cookie
- setDomain("string path"):如果设置相同的一级域名,那么多个服务器之间可以共享cookie:比如setDomain(".alibaba.com"),表示在任何
- 在Tomcat服务器中,一个服务器里部署了多个web项目
-
Cookie的特点
- cookie数据存储在浏览器
- 浏览器对于单个Cookie的数据大小有限制(4kb),同一个域名下的cookie总数量也是有限制(20个)
-
Cookie的作用
- cookie一般用于存储少量的不敏感的信息
- 在不登录的情况下来完成服务器对客户端的身份识别
-
使用cookie实现展示上一次访问时间的小功能:
- 首先获取cookie,查看是否有name为lastTime得到cookie
- 如果有:获取他的值,并展示在页面
- 如果无:创建这个cookie,设置他的值
- 由于时间的格式含有空格(这个特殊字符无法设置为cookie的值),因此要用URLencodeer和URLdecoder处理一下转化为不含空空格的格式,再存储到cookie
@WebServlet("/AccessTimeServlet") public class AccessTimeServlet 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 ("lastTime".equals(cookie.getName())) { flag = true; String lastTime = URLDecoder.decode(cookie.getValue(), "utf-8"); response.getOutputStream().write(("欢迎再次访问,您上次访问时间为:" + lastTime).getBytes("utf-8")); Date date = new Date(); String str_date = "yyyy年MM月dd日 hh:mm:ss"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(str_date); str_date = simpleDateFormat.format(date); str_date = URLEncoder.encode(str_date, "utf-8"); cookie.setValue(str_date); response.addCookie(cookie); } } } if (cookies == null || cookies.length == 0 || !flag) { response.getOutputStream().write("欢迎您第一次访问".getBytes("utf-8")); Date date = new Date(); String str_date = "yyyy年MM月dd日 hh:mm:ss"; SimpleDateFormat format = new SimpleDateFormat(str_date); str_date = format.format(date); str_date = URLEncoder.encode(str_date, "utf-8"); Cookie cookie = new Cookie("lastTime", str_date); response.addCookie(cookie); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
- 首先获取cookie,查看是否有name为lastTime得到cookie
-