一:会话技术
1.会话:用户打开浏览器,点了一些超链接,关闭浏览器的过程
2.会话过程中会产生一些数据,这些数据是每个用户独享的,需要找个地方存起来
3.会话技术就是解决上述问题的,Cookie是客户端技术,Session是服务器端技术
二:Cookie对象
1.Cookie对象的创建
Cookie cookie=new Cookie(key,value);
2.发送Cookie
Response.addCookie(cookie);
3.获取指定的Cookie
// 获得用户发送的所有Cookie
Cookie[] cookies = request.getCookies(); // 如果没发Cookie过来,为null
// 遍历 找到lastAccessTime
String lastAccessTime = null;
for(int i=0; cookies!=null&&i<cookies.length; i++) {
String name = cookies[i].getName(); // 一个Cookie的name
if("lastAccessTime".equals(name)) {
// 找到了, 记下value
lastAccessTime = cookies[i].getValue();
}
}
4.设置Cookie的有效时间
Cookie默认情况下在当前浏览器进程有效,如果想让Cookie长期驻留客户机的硬盘,就需要指定时间 cookie.setMaxAge(time) time以秒为单位,setMaxAge(0):通知浏览器删除该cookie
三:Session对象
1.Session的原理
request对象有个方法是getSession(),首先看浏览器是否发送了Cookie(JSESSIONID),如果发了,拿id去内存中查找对应的Session对象返回,如果没有发Cookie或者没有找到对应的Session对象,创建一个新的Session对象
getSession(boolean create),当create为true的时候,如果内存中有Session就返回,没有就创建新的;create为false的时候,意味着只查找不创建,有就返回,没有也不创建,返回null.
2.Session的运行要依靠Cookie来发送JSESSIONID,如果想让多个浏览器共享一个session,我们就需要人工发送cookie,并设置cookie的有效时间
3.如果浏览器禁用cookie,那么session也就玩不起来了
浏览器禁用Cookie
要想让session好用,就需要在页面跳转时发送sessionid
有一个技术url重写
重写后的地址会在原有的url地址的基础上加上JSESSIONID
如果是超链接或表单提交的地址,重写方式如下:
String newUrl = response.encodeURL(url);
如果是请求重定向的地址,方式如下:
String newUrl = response.encodeRedirectURL(url);
4. session的应用 (重点)
简单购物车的实现 ListServlet BuyServlet ListCartServlet
用户登录 Login.jsp LoginServlet indes.jsp LogoutServlet
防止表单重复提交
可以用js来做,但是只能增加用户的体验,不能完全防止坏人
用session做防表单重复提交
FormServlet HandleFormServlet TokenProcessor
图片验证码
5. session 细节
Session默认的超时时间为 30 分钟
我们可以在 web.xml 文件中进行配置
<session-config>
<session-timeout>1</session-timeout>
</session-config>
request.getSession(create)
create 默认情况下是 true 服务器拿着id去找session对象,找到了返回,没找到创建
如果指定为false,则为只获得不创建
Session.invalidate() 立即销毁session