2018-06-23(session)

HTTP是无状态协议,这意味着每次客户端检索网页时,都要单独打开一个服务器连接,因此服务器不会记录下先前客户端请求的任何信息。

有三种方法来维持客户端与服务器的会话:

1、Cookies

网络服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求。

但是很多时候浏览器并不一定支持cookie。

2、隐藏表单域

一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。

但点击<a href>标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。

3、重写URL

可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。

但缺点是必须为每个URL动态指定session ID,就算这是个简单的HTML页面。


session对象:除了以上几种方法外,servlet提供的HttpSession接口来识别一个用户,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。

Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。

在向客户端发送任何文档内容之前需要调用 request.getSession(),通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象:HttpSession session = request.getSession();

HttpSession 对象中可用的几个重要的方法:

1、public Object getAttribute(String name)    该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。

2、public Enumeration getAttributeNames()    该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。

3、public long getCreationTime()    该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。

4、public String getId()    该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。

5、public long getLastAccessedTime()    该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。

6、public int getMaxInactiveInterval()    该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。

7、public void invalidate()    该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。

8、public boolean isNew(    如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。

9、public void removeAttribute(String name)    该方法将从该 session 会话移除指定名称的对象。

10、public void setAttribute(String name, Object value)     该方法使用指定的名称绑定一个对象到该 session 会话。

11、public void setMaxInactiveInterval(int interval)    该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。


删除Session数据:

完成了一个用户的 session 会话数据,有以下几种选择:

1、移除一个特定的属性:可以调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值。 to delete the value associated with a particular key.

2、删除整个 session 会话:可以调用 public void invalidate() 方法来丢弃整个 session 会话。

3、设置 session 会话过期时间:可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时。

4、注销用户:如果使用的是支持 servlet 2.4 的服务器,可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效。

5、web.xml 配置:如果您使用的是 Tomcat,除了上述方法,还可以在 web.xml 文件中配置 session 会话超时,如下:

<session-config>

<session-timeout>15</session-timeout>

</session-config>

超时以分钟为单位,Tomcat中的默认的超时时间是30分钟。Servlet中的getMaxInactiveInterval( ) 方法以秒为单位返回超时时间。如果在web.xml中配置的是15分钟,则getMaxInactiveInterval( ) 方法将会返回900。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,960评论 1 92
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,665评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,803评论 18 399
  • 等你老了也许在脑海中浮现昨曰画面, 等你老了也许对昨日更多的真惜和怀念, 等你老了,惜日好多话想说出来 等你老了,...
    素姑娘李彩华阅读 432评论 0 0
  • 心情不好,看到它就好起来了,觉得还可以,有点萌萌哒感觉,两个小伙伴在雪地里快乐的玩耍!
    时光的船阅读 541评论 0 3

友情链接更多精彩内容