今天我们来讲一讲JavaWEB中的Session的问题
1.Session的概述
① 什么是Session
是会话的意思,指的是一系列的动作。也可以说是在客户端和服务器端保持状态的方案。
② Session机制
采用的的是在服务器端保持HTTP请求状态的方案。
服务器使用一种类似于散列表或者就是散列表的的结构来保持信息。
当服务器需要为某个客户端的请求创建一个session时,服务器会首先检查这个客户端的请求里边是否包含一个Session标识(SessionID),若该请求中已经包含一个SessionID则说明之前已经为这个客户创建了Session,那么服务器会根据这个SessionID找到Session对象进行使用;若请求的Cookie中没有包含SessionID,那么服务器会为此客户创建一个Session,并且生成一个与此Session相关联的SessionID,这个SessionID将在本次响应中返回给客户端。
2. 保存SessionID的机制
① 初次的请求创建的SessionID会存放在Set-Cookie中的JSESSIONID的值中,然后返回给浏览器然后保存在浏览器上。
② 由于Cookie可以被认为的禁用,所以必须要有其他的机制以便于被禁用时仍然可以使用Session,采用的一种技术是URL重写,即将SessionID附着于URL路径的后边。
这种URL重写技术就是在所有的可能被客户端访问的请求路径包括action a 重定向的url都进行URL重写。具体使用<%= response.encodeURL("URL")%>或者<%= response.encodeRedirectURL("URL")%>这两个方法来进行URL的重写。
3.HttpSession的生命周期
① 何时创建一个Session对象
并非是只要在浏览器上访问一个服务器的JSP/SERVLET就会创建一个Session对象。
对于访问JSP而言:
若当前JSP是是客户端访问当前WEB应用的第一个资源,且JSP指令的session="false",那么不会创建Session对象。
若当前JSP不是客户端访问的当前WEB工程的第一个资源,且其他的页面已经创建了一个HttpSession对象,则当前JSP不会创建一个新的Session对象,而是返回已经创建的HttpSession对象。
对于访问Servlet而言:
若在访问他之前已经访问过JSP/Servlet,那么不会创建新的HttpSession
若Servlet是客户端访问的第一个web应用的资源,则只有当调用了request.getSession()或者request.getSession(true)时,那么才会创建一个HttpSession对象。
② 如何获取一个HttpSession对象
a:request.getSession()若没有session对象则返回null;request.getSession(true),若没有session对象则创建一个新的session对象返回。
③ Session对象的销毁
调用session.invalidate()方法
服务器卸载了当前WEB应用
超过HttpSession的过期时间:set/getMaxInactiveInterval()设置和获取最大过期时间,默认一个session对象的最大过期时间是1800秒即半个小时,所以当我们关闭浏览器再打开时,session对象依然存在于服务器上。
4. HttpSession常用方法示例
getID isNew getMaxInactiveInterval getCreateTime getLastAccessdTime invalidate set/getAttribute
5. Javaweb中的相对路径和绝对路径
① /在路径的意义
当/存在的请求资源中是需要服务器来处理时,那么/就代表当前WEB应用的根路径;若/须交由浏览器去处理的话,那么/就代表当前站点的根路径。代表当前WEB应用:请求的转发、web.xml中的url-pattern(请求的转发至发送了一次请求,直接在服务器中处理了,web.xml文件中的内容当然是服务器来处理的,因为每个WEB服务器也都有一个web.xml文件,和我们工程中的web.xml文件是同一个东西)。代表当前站点:请求的重定向、超链接、form表单(其中<a><form>都是需要浏览器来识别的,而重定向是请求了两次,第一次的响应返回给了浏览器还是需要浏览器处理)
② 我们在开发时尽量要编写一个绝对路径,因为相对路径很容易出问题,而若是对所有的URL进行绝对路径的编写,那么当/代表当前站点的根路径是就需要加上request/application.getContextPath(即项目名)来完成绝对路径的编写了。
③ Javaweb中绝对路径指的是:相对于当前WEB应用的根路径的路径叫做绝对路径。
即任何的路径都要加上ContextPath(项目名)。
6.防止表单的重复提交
① 什么是表单的重复提交
设置情景是:a.jsp-->servlet转发-->b.jsp。当出现网络延迟时我们对响应页面进行刷讯,或者从响应页面退回到请求页面再直接请求、在响应页面未到达时重复点击提交按钮。以上三个都属于表单进行了重复的提交操作,会造成服务器的压力,为了解决这种用户操作性的表单重复提交的问题,我们可以为每一个提交的表单提供一个唯一标识,然后在Servlet中进行识别,若是存在和我们预定义的标识,则Servlet对这个请求的表单进行响应,并删除标识;若不一致或无标记信息,则直接响应提示信息。我们无法将标识存放在表单元素的隐藏于中因为无法删除,也无法将标识存放在request中,因为JSP中的request和Servlet中的request不是同一个request。
解决办法:我们可以将一个随机产生的值存放在session对象中,同时也存放与form表单的元素的隐藏元素中,然后在Servlet中进行对比,若一致则受理请求并删除session中的标识,若不一致则提示请求过了等信息。