• 1. 会话什么是会话 会话可简单理解为:用户开一个浏览器,访问一个或多个web资源,然后关闭浏览器,整个过程我们称之为一次会话。 会话过程中需要解决的问题 每个用户在使用浏览器与服务器进行会话的过程中,都会各自产生一些数据,务服器要想办法为每个用户保存这些数据。 例如:多个用户通过访问一个servlet各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户在访问处理结帐的Servlet时,负责结帐的servlet可以得到用户各自购买的商品为用户结帐。 思考:上述数据保存在request域或servletContext域中行不行?
  • 2. 保存会话数据的两种技术:Cookie Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的Cookie去。这样,Servlet通过读取Cookie就可以获得每个用户保存的数据了。 Session Session是服务器端技术,当用户访问服务器的某个资源时,服务器可以为每一个用户的浏览器创建一个其独享的session对象,并将用户的数据存放在各自的session域中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
  • 3. Cookie技术浏览器服务器servlet1servlet2Set-Cookie2: name=洗衣机Set-Cookie2: name=洗衣机name=洗衣机IE缓存区cookie: name=洗衣机cookie: name=洗衣机
  • 4. Cookie如何获得Cookie对象 javax.servlet.http.Cookie类用于创建一个Cookie Cookie cookie = new Cookie(name,value); Response接口中定义了一个方法用于发送一个Cookie request.getCookie(); Request接口中定义了一个方法用于获得Cookie response.addCookie(cookie); Cookie对象的常用方法 setValue()设置Cookie的值 setMaxAge()设置Cookie时间,如果不设置,默认在浏览器进程有效 setDomain()设置域 setPath() 设置有效路径
  • 5. Cookie案例1显示用户上次访问时间 Cookie细节 一个Cookie对象只能封装一个信息,它由一个名称(name)和设置值(value)组成 一个web站点可以为一个浏览器发送多个cookie对象,同样,一个浏览器也可以存放多个cookie 一般来讲,一个浏览器最多只能存放300个cookie,每个站点最多分配20个,每个cookie的大小限制为4kb 创建了一个新的cookie,默认情况下,只在当前浏览器进程有效,如需将cookie存入客户端硬盘,则要调用setMaxAge设置有效时间 setMaxAge(0)则表示通知浏览器立即删除cookie
  • 6. Cookie应用2显示用户上次浏览过的商品
  • 7. 显示上次浏览商品的实现过程显示网站商品的servlet: Javaweb开发 Jdbc开发 Spring开发 您曾经浏览过的商品 Javaweb开发 Jdbc开发浏览器Servlet(根据ID显示商品详细信息) 发送Cookie Id=2bookHistory=1bookHistory=1Id=1bookHistory=1-2bookHistory=1-2.
  • 8. session服务器可以为每个用户浏览器创建一个session对象 注意:一个浏览器独占一个session对象(默认情况下) Session和Cookie的主要区别在于: Cookie是把用户的数据写给用户的浏览器。 Session技术把用户的数据写到用户独占的session中。 Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象 案例:使用session完成简单的购物案例
  • 9. session浏览器B浏览器A浏览器Cservlet1 Session = request.getsession() Session.setAttribute(name,objcet)Servlet2 Session = request.getsession() obj = Session.getAttribute(name);Session(a) name=洗衣机Session(b) name=电视Session(c) name=冰箱Session小实验:使用IE访问某一个servlet,其它IE可以取到这个servlet存的数据吗?注意,虽然代码相同,但不同浏览器得到的各自的数据
  • 10. session实现原理疑问:服务器是如何实现一个session为一个用户浏览器服务的?浏览器B浏览器Aservlet1 session = request.getSession()Servlet2 session = request.getsession()Session Id=111Session Id=222cookie:Jsessionid=111cookie:Jsessionid=111cookie:Jsessionid=222cookie:Jsessionid=222问题:如何实现多个IE浏览器共享同一session?(应用:关掉IE后,再开IE,上次购买的商品还在。).实验
  • 11. IE禁用Cookie后的session处理实验演示禁用Cookie后servlet共享数据导致的问题。 解决方案:URL重写 response. encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。 response. encodeURL(java.lang.String url) 用于对表单action和超链接的url地址进行重写 附加: Session的失效 web.xml文件配置session失效时间
  • 12. session案例使用Session完成用户登陆 利用Session防止表单重复提交
  • 13. javascript防止表单重复提交不足:但用户单击”刷新”,或单击”后退”再次提交表单,将导致表单重复提交
  • 14. session防止表单重复提交表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。 当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。 在下列情况下,服务器程序将拒绝用户提交的表单请求: 存储Session域中的表单标识号与表单提交的标识号不同 当前用户的Session中不存在表单标识号 用户提交的表单数据中没有标识号字段编写工具类生成表单标识号:TokenProcessor