会话技术
Cookie
百度百科上的定义:
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
原理:当浏览器首次访问服务器时,服务器会返回一个名字为set-cookie
的响应头,其值为形如key=value
的字符串,即set-cookie:key=value
, 浏览器会将该键值对保留到缓存中;当浏览器再次访问服务器时,会发送一个名为cookie
的请求头,即cookie:key=value
主要应用: cookie一般用于存储少量的不太敏感的数据,另外cookie允许在不登录的情况下,完成服务器对客户端的身份识别
java中对应的api
-
创建Cookie对象,绑定数据
new Cookie(String name, String value);
-
发送Cookie对象,即返回
set-cookie
响应头到浏览器。response.addCookie(Cookie cookie);
-
拿到请求头
cookie
中的所有值Cookie[] cookies = request.getCookies();
-
持久化存储, 设置cookie的存活时间。如果值为正数则将Cookie数据写到硬盘的文件中,时间到后,cookie文件自动失效。值为负数则为默认值,值为0删除cookie信息。
// 设置cookie存活时间1个月 cookie.setMaxAge(60 * 60 * 24 * 30);
cookie的共享
当一个服务器部署了多个项目时,为了使各个项目共享cookie,可以通过
void setPath(String url);
设置cookie的作用域,方法的参数是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp)
对于不同服务器,要实现cookie的共享,可以通过
void setDomain(String path);
如果设置一级域名相同,那么多个服务器之间cookie可以共享。例如通过setDomain(".baidu.com")
,那么tieba.baidu.com
和news.baidu.com
中cookie可以共享
Session
广义上讲,session是客户端与服务器交互的抽象,而一般所说的session,则是在服务器内存上的,并可持久化到硬盘中,通常要借助cookie实现。
原理:客户端访问服务器后,会在服务器上创建session对象,在响应报文的响应头set-cookie
中传入session-id。浏览器会将session-id存到cookie中,当再次访问时,在请求头cookie
中放入session-id,这样服务器就知道是哪个session了。
java中对应的api
-
通过request对象获取session
HttpSession session = request.getSession();
-
通过key获取session中的value
Object getAttribute(String name)
-
修改session的key-value
// 设置 void setAttribute(String name, Object value) // 移除 void removeAttribute(String name)
关闭客户端
一般情况下,客户端关闭则会话结束,重新打开访问则是新的会话,为了使客户端关闭后下次仍访问到同一session, 可用如下代码
// 在客户端设置cookie,这样在客户端关闭后,再次请求服务器时可以通过id获取上次的Session
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
关闭服务器
服务器正常关闭之前,会将session对象持久化到硬盘上,服务器启动后,将session文件转化为内存中的session对象。如果发现没有存储session对象,找到tomcat目录下的conf/context.xml
把下面语句的注释了即可。
<Manager pathname="SESSIONS.ser" />
另外,idea在启动服务时,会删除上次保存session对象信息的SESSIONS.ser文件,因此通过idea启动的服务器无法做到关闭后重新访问之前的session