Session

  今天我们来讲一讲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中的标识,若不一致则提示请求过了等信息。

 















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值