背景:
HTTP是无状态纯文本协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的Web程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而Cookie就是解决方案之一。
Cookie
简介
Cookie实际上就是服务器保存在浏览器上的一段信息,主要用于区分不同的用户。
Cookie运行原理
- 请求
- 服务器创建一个Cookie对象,该Cookie对象携带用户信息,服务器发送(响应)给客户端
- 以后客户端再发送请求时,会携带该Cookie对象。
- 服务器会根据该Cookie对象(及信息),区分不同用户。
Cookie的使用:
1、创建
- Cookie cookie = new Cookie(String name,String value);
- response.addCookie(cookie);
2、获取
- Cookie[] cookies = request.getCookies();
- cookie.getName()|getValue()
3、修改
- 覆盖式修改
- Cookie cookie = new Cookie(“同名”,“新值”);
- response.addCookie(cookie);
- 直接修改
- Cookie[] cookies = request.getCookies();
- 找到指定的Cookie
- cookie.setValue(“新值”);
4、Cookie的键值问题
- name不可以为中文,value可以为中文,需要指定字符集问题,所有建议使用英文。
5、Cookie有效性
- 默认为会话级别,与浏览器有关(关闭浏览器或换一个浏览器失效)
- 持久化
- setMaxAge(ss:秒);
- ss>0:在ss秒后失效
- ss=0:立即失效
- ss<0:默认会话级别
- setMaxAge(ss:秒);
注意:持久化Cookie,该Cookie就不是会话级别,以具体的持久化操作为准。
6、Cookie有效路径(Cookie的路径指告诉浏览器访问那些地址时该携带该Cookie)
- 默认有效路径:当前项目路径
- setPath():一般设置有效路径,都是基于当前项目下的路径进行设置。
- 如:cookie.setPath(request.getContextPath()+"/a");
- 设置为 /项目名/路径 cookie.setPath(“/项目名/路径”)
- 这样设置只有访问“/项目名/路径”下的的资源才会携带Cookie
7、Cookie应用
* 记住密码等
8、Cookie缺陷
- Cookie的value为String型,不灵活。
- Cookie存放在浏览器中,不安全。
- Cookie过多,会浪费流量,增加了客户端与服务端的数据传输量。
Session
简介
使用Cookie有一个非常大的局限,就是如果Cookie很多,则无形的增加了客户端与服务端的数据传输量。而且由于浏览器对Cookie数量的限制,注定我们不能再Cookie中保存过多的信息,于是Session出现。
Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session
类型: HttpSession
Session工作原理
- 请求
- 服务器创建Session,同时创建一个特殊的Cookie,该Cookie的key为固定值:JSESSIONID,value为session的id。
- 服务器将该Cookie对象发送(响应)给客户端
- 以后客户端再请求时,会携带该Cookie对象。
- 服务器会根据Cookie的value,找到相应的Session,从而区分不同的给用户。
Session获取
- html(Servlet):request.getSession()
- jsp:直接获取(session是jsp中的隐含对象)
Session有效性
- 默认有效性:当前会话(因为特殊的Cookie是会话级别)
- Session存活时间
- 默认存活时间为30分。
- 持久化Session
-
持久化特殊Cookie
-
设置session的非活动时间
1、 web.xml中* <session-config> <session-timeout>30分钟</session-timeout> </session-config>
2、 session.setMaxInactiveInterval(ss秒);
- ss>0:在ss秒后失效
- ss<=0:永不失效(Tomcat>=7)
- session立即失效
- session.invalidate();
-
Session钝化与活化
- 钝化:将session对象及session对象中的数据,一同从内存中序列化到硬盘的过程称之为钝化。
- 时机:服务器关闭时触发
- 活化:将session对象及session对象中的数据,一同从硬盘反序列化到内存的过程称之为活化。
- 时机:服务器重启时触发
表单重复提交问题
1、 转发,F5
2、提交后,网速慢,连续点击提交按钮
3、提交后,点击回退按钮,继续提交
表单提交流程:
- 提交-Servlet-响应
解决思路:
在Servlet中干预提交,第一次提交,以后不提交
- 使用UUID,作为Token。将Token存放到session域和隐藏域中。( UUID:是一个全球唯一的32为的16进制的随机数。)
- 提交,判断变量是否为初始值
true:提交,移除session域中的Token(UUID)。
false:不提交