zoukankan      html  css  js  c++  java
  • JavaWeb——使用会话维持状态

    1、会话的作用

      使用会话是为了维持状态,维持的是请求域请求之间的状态。因为HTTP请求自身是完全无状态的。从服务器的角度来看,当用户发出第一个请求开始,服务器无法将新的请求与之前的请求关联起来,举例说就是假如你当前的请求是登陆账号,下一个请求是查询信息,服务器端并不清楚这两个请求来自同一个客户。

      你也许认为IP地址可以作为唯一标识符,那么在某一个时间段来自同一IP地址的所有请求一定属于相同的客户端,但是其实这个是不一定的,就比如使用校园网的学生,这些学生使用的是相同的IP地址,他们真实的IP地址隐藏在路由之后。所以所有的HTTP服务器端技术都普遍采用HTTP会话的机制。

    2、会话cookie和URL重写

      在Web会话中,容器和用户浏览器将通过某种方式连接起来,出于这个原因,通常会话会被赋予一个随机生成的字符串,称为会话ID。第一次创建会话的时候(即收到请求时),创建的会话ID会作为响应的一部分返回到用户的浏览器中,接下来从该用户浏览器中发出的请求都将通过某种方式包含该会话ID,通过这个会话ID把请求关联起来。

      将会话ID从服务器返回到浏览器中使用的有两项技术:会话cookie和URL重写

    • 会话cookie是HTTP的一种通信机制,通过Set-Cookie响应头在服务器之间传递任意数据,并存储在用户的计算机中,然后在;通过请求头Cookie从浏览器返回到服务器从。

       cookie可以 有各种不同的特性,例如域名、路径、过期日期或最大生命周期、安全标志只含HTTP的标志  

       这是浏览器和服务器之间的一系列HTTP请求和响应的头数据

       

        第一个响应中的Set-Cookie头将用于将cookie发送到用户浏览器,在Java EE应用服务器中会话cookie的名字默认为JSESSIONID,收到第一个响应之后浏览器会把cookie存储在用户计算机本地,请求的Cookie头也将用于将cookie发送回服务器。

    • URL中的会话ID

       Java应用程序中将会话ID添加到URL的最后一个路径段(或目录)采用这种方式分离会话ID和查询字符串的参数,使他们不会互相冲突,例如:

    http://localhost:8080/hello-world/shop;JSESSIONID=7F2E3989B7780DE?action=view

      将会话ID内嵌在URL中可以避免使用cookie,那么第一次如何将请求URL中的会话ID发送到浏览器呢?下面的头信息将演示如何通过URL内嵌完成与cookie相同的工作的。

      在这个例子中,浏览器通过Location头返回会话ID,浏览器从未真正意识到会话ID的存在,只是重写location头中的URL以及任何响应内容的URL,是所有访问服务器的URL都内嵌此会话ID。

    3、在Web.xml中配置会话

      在许多情况下,都可以直接使用HTTP会话,不需要添加显示的配置,不过默认的设置始终是不够的,所以我们可以在Web.xml中使用<session-config> 标签配置会话,下面列出了部署描述符所有可能用于设置会话的标签。

    <session-config>  
        <session-timeout>30</session-timeout>  
        <cookie-config>  
            <name>JSESSIONID</name>  
            <domain>example.org</domain>  
            <path>/shop</path>  
            <comment>  
                <!-- some information -->  
            </comment>  
            <http-only>true</http-only>  
            <secure>false</secure>  
            <max-age>1800</max-age>  
        </cookie-config>  
        <tracking-mode>COOKIE</tracking-mode>  
        <tracking-mode>URL</tracking-mode>  
        <tracking-mode>SSL</tracking-mode>  
    </session-config>  

      所有在<session-config>和</cookie-config>中的标签都是可选的,但是如果使用了这些标签,就必须按照上面的顺序添加到Web.xml中。

      然后是每个标签的意义:

    • 标签<session-timeout>指定了会话在无效之前,可以保持不活跃状态的时间,以分钟为单位。如果该值小于等于0,那么会话将永远也不过期。如果不设置该值那么将使用容器的默认值.
    • 标签<name>可以自定义会话cookie的名字。默认值为JSESSIONID
    • 标签<domain>将告诉浏览器应该把cookie发送到那个域名中
    • 标签<path>进一步的将cookie限制在了某个特定的URL中
    • 标签<comment>将在会话ID cookie中添加Comment特性,在其中可以添加任意文本。这通常用于解释cookie的目的,并告诉用户网站的隐私策略。
    • 标签<http-only>若为真将会把cookie限制在直接的浏览器请求中,例如JavaScript和Flash将无法访问cookie
    • 标签<secure>若为真浏览器只会通过HTTPS发送cookie,这将保护cookie,避免以未加密的方式进行传输
    • 标签<max-age>指定了cookie的Max-Age特性,用于控制cookie何时过期。默认情况下,cookie没有过期日期,这意味着它将在浏览器关闭时过期。可以自定义该值,单位为秒
    • <tracking-mode>用于表示容器应该使用哪种技术追踪会话ID,它的合法值有:
         URL----容器将只在URL中内嵌会话ID 。不使用cookie或SSL会话ID。这种方式非常不安全。
         COOKIE -----容器将使用会话cookie追踪会话ID 。该技术非常安全。
         SSL ----容器将使用SSL会话ID作为HTTP会话ID。该方法是最安全的方式,但要求使用的所有请求都必须是HTTPS请求。

      

  • 相关阅读:
    [NOI2009]管道取珠
    Rebalance再均衡
    生产者分区写入策略
    Kafka事务
    幂等性
    消费者组
    Kafka中的重要概念
    偏移量offset
    服务注册和发现的意思,Spring cloud如何实现?
    负载平衡的意义
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/8392648.html
Copyright © 2011-2022 走看看