zoukankan      html  css  js  c++  java
  • 第二章_session管理

    2.1 URL重写

    URL重写是Session追踪技术。须要将一个或多个token做为一个查询字符串加入到一个URL中。

    Token的格式通常是键=值。

    Url?key-1=value-1&key-2=value-2...&key-n=value-n

    2.2 隐藏域

    利用隐藏域来保持状态,与採用网址重写技术类似。但它不是将值加入到URL后面,而是将他们放在HTML表单的隐藏域中。当用户提交表单时,隐藏域的值也传送到server。仅仅有当页面包括表单。或者能够在页面中加入表单时,才适合使用隐藏域。

    这样的技术胜过网址重写的地方在于。能够将很多其它的字符传到server。而且不须要进行字符编码。可是像网址重写一样,也仅仅有当要传递的信息不须要跨越多个页面时。才适合使用这样的技术。常见的隐藏域我们用来显示id,这样方便编辑的时候能够依据id获取到值显示出来。

    2.3 Cookie

    Cookie是自己主动在Webserver和浏览器之间来回传递的一小块信息。

    Cookie适用于那些须要跨越很多页面的信息。因为cookie是做为HTTP标头嵌入的,因此传输他的过程由HTTP协议处理。除此之外,还能够依据自己的须要设置cookie的有效期限。

    对于Web浏览器而言,每台Webserver最多能够支持20cookie

    Cookie的不足之处在于,用户能够通过改动他的浏览器设置来拒绝接受cookie

    要使用cookie,必须熟悉javax.servlet.http.cookie类,以及HttpServletRequestHttpServletResponse接口中的几个方法。

    要创建一个cookie,传递一个名称和一个值给Cookie类的构造器:

    Cookie cookie = new Cookie(name,value) ;

    比如。要创建一个选择语言的cookie。能够这么写:

    Cookie languageSelectionCookie = new Cookie(“language”,”Italian”) ;

    创建cookie之后,能够设置他的domainpathmaxAge属性。

    尤其值得关注的是maxAge属性,由于它决定cookie的有效期。

    httpservletResponse.addCookie(cookie);

    当浏览器再次发出对同一个资源或者对同一台server中的不通资源的请求时。它会同一时候把从Web浏览器处收到的cookie再传回去。

    要訪问浏览器发出的cookie,能够在HttpServletRequest中使用getCookies方法。该方法将返回一个Cookie数组。假设请求中没有cookie,将返回null。为了找到某个名称的cookie。须要迭代数组。以下举个样例,看看怎样读取一个名为maxRecordscookie

    Cookie[] cookies = request.getCookies() ;
    		Cookie maxRecordsCookie = null ;
    		if(cookies != null){
    			for(Cookie cookie:cookies){
    				if(cookie.getName().equals("maxRecords")){
    					maxRecordsCookie = cookie ;
    					break ;
    				}
    			}
    		}

    令人遗憾的是,没有getCookieByName方法能够使获取cookie变得更简单一些。

    更令人难过的是。也没有方法能够直接删除cookie。为了删除cookie。须要创建一个同名的cookie,将它的maxAge属性设置为0,并在HttpServletResponse中加入一个新的cookie。看看以下是怎样删除一个名为userNamecookie的:

    Cookie cookie = new Cookie(“userName”,””) ;

    cookie.setMaxAge(0) ;

    response.addCookie(cookie) ;

    2.4 HttpSession对象

    HttpSession是当一个用户第一次訪问某个站点时自己主动创建的。

    通过在HttpServletRequest中调用getSession方法,能够获取用户的HttpSessiongetSession有两个重载方法:

    HttpSession getSession()

    HttpSession getSession(boolean create)

    无參的getSession方法返回当前的HttpSession。假设当前没有,则创建一个并返回。

    getSession(false)方法返回当前的HttpSession(若有),假设没有,则返回nullgetSession(true)方法返回当前的HttpSession(若有),假设没有,则新建一个并返回。

    getSession(true)getSession是一样的。

    放在HttpSession中的值是保存在内存中的。

    加入到HttpSession中的值不一定是String,能够为随意java对象,仅仅要它的类实现了java.io.Serializable接口就可以,以便当Servlet容器觉得有必要的时候,保存的对象能够序列化成一个文件或者保存到数据库中,比如。当容器的内存快要用完的时候。仍然能够将非序列化的对象保存在HttpSession中,可是假设Servlet容器试图将他们序列化,将会以失败告终,并抛出异常。


    通过在HttpSession中调用getAttribute方法,同一时候传递一个属性名称,能够获取HttpSession中保存的对象。

    这种方法的签名例如以下:

    java.lang.Object getAttribute(java.lang.String name)

    HttpSession中还有一个实用的方法是getAttributeNames。它返回一个Enumeration,迭代一个HttpSession中的全部属性:

    java.util.Enumeration<java.lang.String> getAttributeNames()

    注意,HttpSession中保存的值不发送到client,这与其它的Session管理方法不同。而是servlet容器为它所创建的每个HttpSession生成一个唯一标识符。并将这个标识符做为一个token发送给浏览器,通常是做为一个名为JSESSIONIDcookie,或者做为一个jessionid參数加入到url后面。在兴许的请求中。浏览器会将这个token发送回server。使server可以知道是哪个用户在发出请求。不管servlet容器选择用哪一种方式传输session标识符,那都是在后台自己主动完毕的,不须要你去做额外的处理工作。

    Java.lang.String getId()

    HttpSession中还定义了一个invalidate方法。这种方法强制Session过期,并将绑定到它的全部对象都解除绑定。

    在默认情况下。HttpSession是在用户静默一定时间之后过期,能够在部署描写叙述符的session-timeout元素中将session的期限设置为整个应用程序。比如,将这个值设为30,使全部session对象在用户最后一次訪问之后30分钟过期。假设没有配置这个元素。这个期限将由servlet容器决定。

    非常多时候,还须要销毁未过期却又无用的HttpSession实例,以便释放一些内存空间。

    能够调用getMaxInactiveInterval方法,以了解一个HttpSession在用户最后一次訪问之后还能够维持多久。这种方法返回用户离开的秒数。setMaxInactiveInterval方法能够帮助你为个别HttpSessionSession期限设置一个不同的值。

    Void setMaxInactiveInterval(int seconds)

    假设向这种方法传递0,那么HttpSession将永远不会过期。

    一般来说,这不是一个好方法,由于HttpSession占用的堆(heap)空间将永远不会释放,直到应用程序卸载或Servlet集装箱特写。


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4675612.html
Copyright © 2011-2022 走看看