一、会话的概念
- 什么是会话?
- 用户开一个浏览器,访问服务器的多个web资源,然后关闭浏览器,整个过程称之为一个会话。
- 会话中的问题
- 程序要为每个客户端保存数据,
- 方式有两种:cookie和session
- 另外request.servletContext行不行?
- 这个方法会保存所有的客户信息。
- 程序要为每个客户端保存数据,
- 浏览器IE,在什么情况下会开启一次新的会话。
-
- 1、IE7(含)-:
- 开启一个新的浏览器进程,就是一次新会话。
- 2、IE8(含)+:
- 开启一个新的浏览器进程,并没有开始新会话。(文件菜单、开始新会话)
- 新开启一个Tab页,与原有页面属于同一次会话。
- 通过一个页面的超链接(target="_blank"),与原有页面属于同一次会话。
-
- cookie
- 什么是cookie: 下面1和2都可以解释
- Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
- Cookie是一段小信息。Servlet把这些小信息写到客户端的缓存中(Set-Cookie),客户端还能带着小信息给服务器(Cookie)。
- 怎么得到Cookie
- javax.servlet.http.Cookie类用于创建一个Cookie,response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。
- cookie的常用方法
- public Cookie(String name,String value)
- setValue与getValue方法
- setMaxAge与getMaxAge方法 (秒)
- setPath与getPath方法
- setDomain与getDomain方法
- getName方法
- Cookie的属性
- name:(必须的)
- value:(必须的)
- comment:(可选的)针对该Cookie的注释。
- path:(可选的)默认值是写Cookie的那个Servlet的访问路径。/day06/servlet/CookieDemo1
- 举例:
- 有一个cookie,名为a,它的路径为/day06/servlet
- 当访问http://localhost:8080/day06/aaa/SomeServlet时,浏览器不会带名为a的cookie带过来。
- 当访问http://localhost:8080/day06/servlet/bbb/ccc/ddd/aaaCookieDemo2,浏览器会带名为a的cookie带过来。
- 如果把cookie的路径设置为"/day06",意味着,day06中的所有资源都能得到a。
- 举例:
- domain:(可选的)默认值是写Cookie的那个网站。如果domain取值为localhost,那么只有访问localhost这个网站时才会带过去。
- maxage:(可选的)设置Cookie的最大存活时间。默认值是浏览器进程(一次会话)。单位是秒。
- version:(可选的)每个客户端针对一个网站,只支持20个cookie。最多保存300个cookie。每个cookie大小不能超过4KB
- cookie技术示意图
- Tip: cookie的组成部分
- domian+path+name:唯一定位一个Cookie
- localhost/day06/servlet/lastAccessTime
- localhost:domain
- /day06/servlet/:path
- lastAccessTime:name
- 方法
- b、如何向客户端写Cookie:HttpServletResponse.addCookie(Cookie c)
- c、服务端如何得到客户端带过来的cookie:HttpServletRequest.getCookies()
- 注意事项: 生存周期和删除
- 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。
- 若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
- 注意,删除cookie时,path必须一致,否则不会删除
- 什么是cookie: 下面1和2都可以解释
- HttpSession
- 什么是 HttpSession
- Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
- 原理:
- HttpSession,它也是一个域对象。
- 实际上用的是cookie技术。服务器向客户端写了一个特殊的cookie,名字为"JSESSIONID",值为当前session对象的id(唯一),path是当前应用。
- 常用方法:
- HttpServletRequest.getSession():根据客户端cookie(JSESSIONID)的值查找session对象,没有,创建一个session对象。
- HttpServletReqeust.getSession(boolean create):如果为true,与a没有区别。如果为false,只会查找。
- HttpSession.getId():唯一的session对象标识。
- HttpSession示意图
- Session的组成部分
- Session的状态转换
- 修改HttpSession对象的默认失效时间30分钟
- web.xml
- <session-config>
- <session-timeout>1</session-timeout><!--失效时间,单位是分钟-->
- </session-config>
- Session注意事项
- 服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。
- Session和Cookie的主要区别在于:
- Cookie是把用户的数据写给用户的浏览器。
- Session技术把用户的数据写到用户独占的session中
- Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
- Session案例:
- 完成用户的一次性登陆(含验证码)
- 在一次会话中,可以使用session保存用户的登陆状态。
- 验证通过后,在session中设置一个属性session.setAttribute("user", user);
- 注销时,session.removeAttribute("user");
- 防止表单重复提交:MD5、Base64编码
- 一个表单重复提交,可能产生很大隐患,例如购物网站中多次提交,会提交多条相同数据,引起数据库异常。
- 怎么防止表单重复提交,可以在用户访问注册页面时,服务器给客户端在隐藏域中写一个token(令牌),服务器本身也在session中保存一个相同的token.
- 浏览器访问服务器时,会把这个token携带过来,服务器会比对这个token和session中的token是否一致,一致是第一次提交,保存数据。然后删除session中的token,这时重复刷新就会产生令牌不一致,防止了重复提交。
- 下面的说法,正在思考中
- 浏览器访问服务器时,会把这个token携带过来,服务器会比对这个token和session中的token是否一致,一致是第一次提交,保存数据。然后应该重新得到一个新token,替换session中的,并传回给客户端。这样用户重新提交时,令牌会与服务器的新令牌不一致,就可以防止重复提交
- 这是上面防止提交的完全说法(服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生)
- 客户端禁用cookie后,会话数据的保存问题
- 对于使用http://localhost来访问网站,即使客户端禁用了cookie,但是无效。
- 解决办法:URL重写。
- http://192.168.1.250:8080/day07/servlet/RegistServlet
- ---->
- http://192.168.1.250:8080/day07/servlet/RegistServlet;JSESSIONID=2983749832743298
- String url = HttpServletResponse.encodeURL(String url)
- 特点:如果服务器知道客户端没有禁用cookie,那么该方法将不会重写URL。
- 完成用户的一次性登陆(含验证码)
- 什么是 HttpSession