会话过程
一次简单请求过程:浏览器发送请求到服务器,服务器解析请求创建request和response对象
将请求转给对应的servlet对象,调用service方法,处理业务,产生响应数据
封装响应数据,返回浏览器响应
至此request和response域对象消亡
一次简单的会话过程:浏览器访问服务器到浏览器的关闭代表了一次会话
用户的数据如果存放在request域中的话,域对象的范围太小,
每次请求都会产生新的请求对象,用户数据无法持久
用户的数据如果存放在servletContent域中的话,域对象的范围太大,
当前服务不停止,域对象一直存在,过于消耗资源
因而产生了cookie与session对象来存储用户的数据
cookie
会话技术分为Cookie和Session
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,
安全性不好,客户端可以清除或者禁用cookie
cookie流程
客户端发送请求到服务器,服务器将信息写入cookie对象,将cookie对象加入响应对象中响应给客户端
客户端每次发送请求的时候在请求头中都会带上这个cookie对象
Cookie:JSESSIONID=A242202CB4BCE9BDA489F7555544388D;
username=xxx
无论访问什么资源地址都会带上这个cookie对象
cookie应用
在Servlet中创建Cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);
注意:Cookie中不能存储中文
向响应中添加cookie
response.addCookie(Cookie cookie);
Cookie的持久化时间
cookie默认是存储在浏览器的缓存中,是会话级别的,会话开始而存在,会话结束(浏览器关闭)而销毁
想延长cookie在客户端的持久化时间,需要单独设置
cookie.setMaxAge(int seconds); ---时间秒
这样Cookie就会存储到硬盘中,不会因为浏览器的关闭而销毁
只会因为持久化时间的到来而销毁
Cookie的携带地址设置
无论访问什么资源地址都会带上cookie对象
可以设置携带Cookie对象的资源地址
cookie.setPath(String path); 只允许path资源路径可以携带Cookie对象
示例:
cookie.setPath("/WEB");
代表访问WEB应用中的任何资源都携带cookie
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
例如该cookie对象产生路径为/WEB/mycookie/coo下产生,
不设置携带路径,则/WEB/mycookie下所有路径的访问都会携带cookie信息
获取cookie参数
Cookie[] cookies = request.getCookies();获取请求中的cookie对象
通过cookie名称获得想要的cookie
if(cookies!=null){
for(Cookie cookie : cookies){
//获得cookie的名称
String cookieName = cookie.getName();
if(cookieName.equals("name")){
//获得该cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
将用户最后访问时间封装到cookie中
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = format.format(date);
Cookie cookie = new Cookie("lastAccessTime",currentTime);
cookie.setMaxAge(60*10*500);
response.addCookie(cookie);
String lastAccessTime = null;
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie coo : cookies){
if("lastAccessTime".equals(coo.getName())){
lastAccessTime = coo.getValue();
}
}
}
response.setContentType("text/html;charset=UTF-8");
if(lastAccessTime==null){
response.getWriter().write("您是第一次访问");
}else{
response.getWriter().write("您上次的访问的时间是:"+lastAccessTime);
}
Cookie中存入中文
cookie不能直接存入中文
但是可以将中文编码为二进制文件再存入
取出时再解码为字符串即可
String username = request.getParameter("username");
String username_code = URLEncoder.encode(username, "UTF-8");
Cookie cookie_username = new Cookie("cookie_username",username_code);
cookie_username.setMaxAge(60*60);
cookie_username.setPath(request.getContextPath());
response.addCookie(cookie_username);
获取cookie中的中文编码
String cookie_username = null;
Cookie[] cookies =request.getCookies();
if(cookies!=null){
for(Cookie cookie : cookies){
if("cookie_username".equals(cookie.getName())){
cookie_username = cookie.getValue();
cookie_username = URLDecoder.decode(cookie_username, "UTF-8");
}
}
}
Session
Session基于Cookie技术的,Cookie存储Session标识ID——JSESSIONID
请求达到服务器,服务器创建一个session对象在服务器端存储(仅作用于一次会话)
返回session标识ID存放到cookie中,下次访问时自动带上session标识ID
服务器通过session标识ID找对应的session对象
发送编号和根据编号去寻找Session对象是服务器自动去完成的,不需要手动设置
一个客户端只会存在一个session
不同的浏览器访问同一个服务器session是不同的
session存储在服务端
Session应用
Session的获取
request.getSession();通过请求对象获取Session对象
session.setAttribute(key, value);Session对象存储数据
当存储的是一个对象时,该对象需要实现序列化接口Serializable
session.getId();获取session对象的id
request.getSession()方法内部会判断 该客户端是否在服务器端已经存在session
如果该客户端在此服务器不存在session 那么就会创建一个新的session对象
如果该客户端在此服务器已经存在session 获得已经存在的该session返回
HttpSession session = request.getSession();
session.setAttribute("name", "zs");
String id = session.getId();
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB/");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
response.getWriter().write("JSESSIONID:"+id);
HttpSession session = request.getSession();
Object attribute = session.getAttribute("name");
Session对象的生命周期
创建:第一次执行request.getSession()时创建
销毁:
1)服务器(非正常)关闭时
2)session过期/失效(默认30分钟)
问题:时间的起算点 从何时开始计算30分钟?
从不操作服务器端的资源开始计时(不发送请求,不操作资源)
可以在工程的web.xml中进行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手动销毁session
session.invalidate();
浏览器关闭不会导致session销毁
JSESSIONID是存储在浏览器的,所以关闭浏览器后Cookie对象会销毁,再次打开浏览器session对象就是新的对象
如果禁止浏览器的Cookie就会使得session的方法出错,如session.setAttribute()存入数据时,getAttribute()获取的值为null
session的钝化与活化技术
session的活化(从硬盘到内存)
session的钝化(从内存到硬盘)
HttpSessionActivationListener接口可以监听session的钝化和活化
重写sessionWillPassivate方法:监听钝化
重写sessionDidActivate方法:监听活化
示例:
1.自定义一个MyTest类实现Serializable接口和HttpSessionActivationListener接口
2.在servlet中创建这个MyTest类,为其属性赋值
3.将这个对象存储到session中
4.获取session中的数据