2016-1-30 Servlet中Session管理(Sesssion追踪)

时间:2022-09-07 22:43:41

Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题。这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的用户。
应用程序应该记住哪些程序成功登陆。换句话说,它必须能够管理用户Session

保持状态的4中方法:网址重写(URL rewriting)、隐藏域、cookie、及HTTPSession对象。

2.1    网址重写
    是一种Session追踪技术,需要将一个或多个token作为一个查询字符串添加到一个URL中。token的格式一般是 键=值:
    url?key-1=value-1&key-2=value-2...&key-n=value-n
    注意,URL和token之间要用一个问号(?)隔开,两个token之间则是用一个&符号隔开
    如果token不必再过多的URL中四处携带,那么网址重写就比较合适。
    但网址重写有如下缺点:
        在有些Web浏览器中,URL限制为2000个字符。
        仅当有链接要插入值时,值才能转换成后面的资源。此为,要把值添加到静态页面的链接中一般不容易。
        网址重写必须在服务器端有效。所有的链接必须带有值。这样可能出现一个问题,即一个页面可能偶许多个链接。
        某些字符,例如空格、&、及问号都必须进行编码。
        添加到URL中的信息时明显可见的,这是情况有时候可不是我们所期待的。
    由于以上限制,网址重写适用于那些即需要保持,有不跨太多页面,并且有不太重要的信息。

2.2    隐藏域
    利用隐藏域来保持状态,与网址重写类似。但是它不将值添加到URL后面,而是将他们发到HTML表单的隐藏域中。
    当用户提交表单时,隐藏域中的值也传送到服务器。只有当页面包含表单,或者可以在页面中添加表单时,才适合使用隐藏域。
    这种技术胜过网址重写的地方在于,可以将更多的字符串传到服务器,而不需要进行字符编码。
    但是也像网址重写一样,也只有当要传递的信息不需要跨越多个页面时,才适合这种技术。

2.3 Cookie
    cookie是自动地在Web服务器和浏览器之间来回传递的一小块消息。cookie适用于那些需要跨越多个页面的信息。
    由于cookie是作为HTTP标头切入的。因此传输它的过程有HTTP协议处理。除此之外,可以根据自己的需要设置Cookie的有效期。
    每台Web服务器最多可以支持20个Cookie。
    cookie的不足之处在于,用户可以通过修改浏览器设置来拒绝接受Cookie。
    要使用Cookie,必须熟悉javax.servlet.http.Cookie类,以及HttpServletRequest和HttpServletResponse接口中的几个方法。
    要创建cookie,传递一个名称和一个值给Cookie类的构造器。
    Cookie cookie = new Cookie(name, value);
    例如要创建一个选择语言的Cookie,可以这么写:
        Cookie languageSelectCookie = new Cookie("language", "Italian");
    创建了Cookie之后,可以设置它的domain、path、及maxAge属性。
    为了将一个cookie发送到浏览器,需要在HttpServletResponse上调用add方法。
    HttpServletResponse.add(cookie);
    当浏览器再一次发出对同一个资源或者同一台服务器中不同资源的请求时,它会同时把从Web浏览器处收到的Cookie再传回去。
    cookie也可以利用JavaScript在客户端进行创建和删除。(!!)
    要访问浏览器发出的Cookie,可以在HttpServletRequest中使用getCookies方法。
    该方法将返回一个Cookie数组,如果请求中没有Cookie,将返回null。为了找到某个名称的cookie,需要迭代数组。
    没有getCookieByName方法可以是获取Cookie更简单一些。
    也没有方法可以直接删除Cookie。为了删除Cookie,需要创建一个同名的Cookie,将他的maxAge属性设为0,并在HttpServletResponse中添加一个新的cookie。

2.4    HttpSession对象
    所有的Session追踪中,HttpSession对象是最强大的,也是功能最多的。用户可以没有或者有一个HttpSession,并且只能访问自己的HttpSession对象。
    HttpSession对象当一个用户在第一次访问某个网站时自动创建的。通过HttpServletRequest中调用的getSession方法,可以获取用户的HttpSession。getSession有两个重载方法:
        HttpSession getSession()
        HttpSession getSession(boolean create)
    无参数的getSession方法返回当前的HttpSession,如果没有将创建一个并返回。
    getSession(false)方法返回当前的HttpSession,如果没有HttpSession,将返回null
    getSession(true)方法返回当前的HttpSession,如果没有HttpSession,将新建一个并返回。
    getSession() 和 getSession(true)是一样的。
    HttpSession的setAttribute方法将放一个值在HttpSession中,其方法签名如下:
        void setAttribute(java.lang.String.name, java.lang.Object value)
        
    注意与网址重写、隐藏域、cookie不同的是,放在HttpSession中的值是放在内存中的。因此你要确保将尽可能小的对象放在里面,并且数量不能太多。
    总而言之,放在HttpSession中的内容要慎重。
    添加到HttpSession中不一定是String,可以是任意java对象,只要它的类实现了java.io.Serializable接口就好,以便当Servlet容器认为有必要的时候,保存的对象可以序列化成一个文件或者保存到数据库中,
    --例如容器的内存将要用完时,任然可以将非序列化的对象保存在HttpSession中,但是如果Servlet容器试图将其序列化时,将会抛出异常。
    setAttribute方法要求不同的对象要有不同的名称。如果传递一个之前用过的属性名称,那么该名称将于旧值无关,而与新值有关。
    通过在HttpSession中调用getAttribute方法,同时传递一个属性名称,可以获取HttpSession中保存的对象。
    
    java.lang.Object getAttribute(java.lang.String name)
    
    HttpSession中的另一个有用的方法是getAttributNames,它返回一个Enumeration,迭代一个HttpSession中的所有属性。
    
    java.util.Enumeration<java.lang.String> getAttributeNames()
    注意,HttpSession中保存的值不发送到客户端,这这与其他Session管理方法不同。而是Servlet容器为它所创建的每一个HttpSession生成一个唯一标识符,
    并将这个标识符作为一个token发送给浏览器,一般是作为一个名为JSESSIONID的cookie,或者作为一个jsessionid参数添加到URL后面。在后续的请求中,浏览器会将这个token发送回服务器,使服务器能够知道是哪个用户在发送请求。无论Servlet容器选择用哪一种方法传输session标识符,那都是在后台自动完成的,不需要你做额外的处理工作。
    通过在HttpSession中调用getId方法,可以获取HttpSession的标识符。
    java.lang.String getId()
    HttpSession中还定义了一个invalidate方法。这个方法强制Session过期,并将绑定到它的所有对象都解除绑定。在默认情况下,HttpSession是在用户静默一段时间后过期。可以在部署描述符的session-timeout中将session的期限设置为整个应用程序。
    很多时候,还需要销毁未过期却没有用的HttpSession实例,以便释放一些内存空间。
    可以调用getMaxInactiveInterval方法,以了解一个HttpSession在用户最后一次访问之后还可以维持多久。这个方法返回用户离开的秒数。
    void setMaxIncativeInterval(int seconds)
    如果向这个方法传递0,那么HttpSession将永远不会过期。

2016-1-30 Servlet中Session管理(Sesssion追踪)的更多相关文章

  1. &lbrack;javaEE&rsqb; Servlet中Session的使用

    Session是一个域 作用范围:当前会话范围 生命周期:当程序第一次调用request.getSession()创建出客户端的session对象,30分钟没有操作认为超时,这个可以在web.xml中 ...

  2. servlet中Session的用法

    ## (1)什么是Session? 服务器端为了保存用户的状态而创建的一个特殊的对象(即session对象).          当浏览器第一次访问服务器时,服务器会创建session对象(该    ...

  3. servlet中session的使用

    1.获取session HttpSession session=request.getSession(); session.setAttribute("variety", vari ...

  4. servlet 中session的使用方法(创建,使用)

    创建: protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, ...

  5. Shiro权限管理框架(四):深入分析Shiro中的Session管理

    其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...

  6. 转:通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  7. 通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  8. 通过 Spring Session 实现新一代的 Session 管理

    长期以来,session 管理就是企业级 Java 中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原 ...

  9. How Tomcat works — 八、tomcat中的session管理

    在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session ...

随机推荐

  1. 学习笔记:MySQL数据库初步 概念

    数据库 什么是数据库,数据库就是对大量信息进行管理的高效的解决方案,按照数据结构来组织.存储和管理数据的载体.而我们常说的数据库可以分为关系型和非关系型数据库. 关系型数据库 这里说的关系型数据库,是 ...

  2. jsp js action之间的传值

    1.struts2 action如何向JSP的JS函数传值 action中定义变量public class TestAction extends ActionSupport implements Se ...

  3. 对于字符串拼接,string&period;format、stringbuilder、&plus;&equals;

    sring拼接经常会用到,拼接时候使用的方法,每个人的又不一样,有的是不知道哪个效率高,也有一些是为了方便不差那么一点时间! 今天百度查了查他们的区别! += 是效率最低的一个,尽量避免使用,当然,不 ...

  4. Java 在某一个时间点定时执行任务&lpar;转载&rpar;

    java定时任务,每天定时执行任务.以下是这个例子的全部代码. public class TimerManager { //时间间隔 private static final long PERIOD_ ...

  5. 使用matplot绘图 &commat;python

    1. 使用csv 模块读取数据 2. 定义label 3. 绘图,调参 #!/usr/bin/env python # coding=utf-8 import sys import matplotli ...

  6. 无法将 grub-efl-amd64-signed 软件包安装&sol;target&sol; 中

    64位win7下U盘安装64位ubuntu12.04,出现[无法将 grub-efl-amd64-signed 软件包安装/target/ 中]的错误 1. 已经确认为 12.04.2 的 Bug B ...

  7. Log4net 列

    配置 <configuration> <configSections> <section name="log4net" type="Syst ...

  8. C&plus;&plus;它tinyXML使用

    tinyXML一个非常好的操作C++图书馆,文件不大,但方法非常丰富.和apache的Dom4j能够披靡啊! 习惯了使用java类库的我看到这么丰富的c++类库,非常高兴!它使用非常easy.仅仅须要 ...

  9. JS的基本类型(小知识)

    一:js中的基本类型: 基本类型:boolen, string ,number,null,undefined 引用类型:object,和函数 二.undedifned和null的区别: 1 undef ...

  10. tensorflow object detection api graph rewriter

    目前,tensorflow 目标识别的api函数可以使用 graph rewriter这样的配置,这样配置的引入主要是为了模型压缩使用,具体设置参数有: syntax = "proto2&q ...