目标
- 状态管理概述
- cookie
- Session
- URL重写
- 隐藏表单
Web状态管理概述
HTTP协议使用是无状态的连接
对于容器,每一个请求都是一个新的客户。
管理方案:
- cookie
- Session
- URL重写
- 隐藏表单(hidden)
什么是会话?
会话:打开浏览器,通过超链接或者按钮访问服务器,然后获取到内容,然后关闭浏览器,称为一次会话。
会话解决的问题?
用户访问服务器,想要保存当前的数据。
隐藏字段(隐藏表单)
在表单中加入:
<input type = "hidden" name = "session" ……>
- 对用户在网站上的访问进行跟踪
- 为服务器程序提供预定义的输入
- 储存动态产生的页面上下文信息
hidden:
- 可以区分多个表单提交。
- 可以保存当前用户操作表格的状态。
- 防止表单重复提交
- 保存用于的登录状态
不足:后台有时候需要动态生成一个hidden
cookie
cookie 是客户端的技术,程序把每个用户的数据都通过键值对的方式保存到cookie。
下次请求的时候,就将cookie放在请求头里面再次访问服务器,那服务器就可以根据cookie里面的内容来判断当前用户的状态。
代码操作
/*得到客户端发过来的cookie*/
Cookie[] ck = request.getCookies();
/*第一次是访问cookie是空的*/
if(ck != null ){
for(int i = 0 ; i < ck.length ; i++){
System.out.println();
}
}else{
/*创建cookie*/
Cookie cook = new Cookie("键","值");
/*发送回客户端保存cookie*/
/*cookie 的时间是默认会话就消失,所以调用setMaxAge设置过期时间,将cookie保存到硬盘。 参数的单位是秒*/
cook.setMaxAge(100);
/*销毁cookie,设置setMaxAge(0)*/
response.addCookie(cook);
}
Session
把客户的信息保存在服务端。
服务器端的技术,利用这个技术,可以为每一个浏览器(用户)创建一个独享的session
对象。
session的流程:
1.客户端请求服务器--创建一个session,将sessionID 保存到cookie里面去,再将cookie发送回客户端。
2.客户端再次发送请求,就将cookie发送给服务器,服务器取出sessionID去匹配所有的session,返回当前匹配的session对象。
代码操作
/*创建session对象,可以加入参数false ,就是如果没有匹配成功就返回null,如果加入了false 就不能用isNew()方法*/
HttpSession hsession = request.getSession();
/*
* int id = hsession.getId();
* 获取到cookie里面的id和session进行匹配
* 匹配成功就返回当前session对象,匹配失败,就创建一个新的session.
* 都是底层实现
*/
/*当前方法可以判断session是新的还是直接返回匹配以前的session*/
if(session.isNew()){
/*存储数据在session对象*/
session.setAttribute("键","值");
}else{
session.getAttribute("键");
}
/*设置session的销毁时间,是以秒作为单位的,这里的时间是最长不活动时间*/
session.setMaxInactiveInterval(2000);
/*立即销毁,注销功能就是立即销毁*/
session.invalidate();
配置文件设置销毁功能:
<session>
<!--这里的参数单位是分钟,只能是正整数,最长不活动时间间隔-->
<sesssion-timeout>1<session-timeout>
</session>
cookie默认是会话结束就消失,为了处理这个问题,
覆盖getsession底层自己创建好的cookie
Cookie c = new Cookie("JSESSIONID",session.getId());
然后设置cookie的销毁时间
c.setMaxAge(24*3600);
:上下午对象是所有servlet和所有用户都共享的,session是所有servlet共享的,但是每个用户是单独的session!