zoukankan      html  css  js  c++  java
  • 会话跟踪Cookie与Session

        会话跟踪用来跟踪用户的整个会话,常用的是Session和Cookie。Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

    1.Cookie 

    1.1概念及使用方法

      Cookie实际上是一小段文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来,当浏览器再请求该网站时,把请求的网址连同该Cookie一同交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

      java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Coolkie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的所有Cookie(Cookie[]),通过response.addCookie(Cookie cookie)向客户端设置Cookie。

      Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类。

    1.2不可跨域名性

      根据域名的不同,网站只能操作自己的Cookie,这是由客户端浏览器决定的。

    1.3Unicode编码:保存中文

      使用时可以用如下语句生成Cookie  及从Cookie中取值

    Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"));
    
    String cookieName=URLDecoder.decode(cokie.getName()),"UTF-8";

    1.4BASE64编码:保存二进制图片

    //in
    byte binary;//输入流输入图片
    String content = BASE64Encoder.class.newInstance().encode(binary);
    Cookie cookie=new Cookie("file", content);
    
    //out
    byte[] binary=BASE64Decoder.class.newInstance().decodeBuffer(cookie.getValue(),.replace(" ",""));
    response.getOutputStream().write(binary);

    1.5Cookie的所有属性

     

    1.6Cookie的有效期

       Cookie的maxAge决定着Cookie的有效期,单位为妙。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

      如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将其写到对应的Cookie文件中,下面的Cookie信息将永远有效。

    cookie.setMaxAge(Integer.MAX_VALUE);

      如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie失效。不会被写入Cookie文件中。

    1.7删除和修改

      如果maxAge为0,则表示删除该Cookie。

      response对象提供的Cookie操作方法只有一个添加操作add,要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie。

    1.8Cookie的域名

      同一一级域名下的二级域名不可交互使用Cookie,如果想二级域名下都可以使用该Cookie,需要设置Cookie的domain参数

    1.9Cookie的路径

      path属性决定允许访问Cookie的路径,path属性需要使用符号“/”结尾。

    1.10JavaScript操作Cookie

      document.cookie可以获得本页面所有的Cookie,各Cookie之间用分号";"隔开。获取Cookie可以用split函数切Cookie字符串。

      设置Cookie可以直接赋值 document.cookie = name + "=" + emcodeURI(value);

    2.Session

    2.1概念及使用方法

      客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以。对应的类为javax.servlet.http.HttpSession。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。在客户端第一次请求服务器时创建。

      Servlet中必须使用request来编程式获取HttpSession对象,而JSP中内置了Session隐藏对象,可以直接使用。 request.getSession()方法获取Session,使用getAttribute(String key)和setAttribute(String key, Object value)方法来读写客户状态信息。

    2.2Session的生命周期

      Session保存在服务器内存中,每个用户都会有一个独立的Session,因此Session里的信息应该尽量精简。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。服务器会把长时间没有活跃的Session从内存删除,Session就自动失效。Session的超时时间为maxInactiveInterval属性,可以通过getMaxInativeInterval()获取,通过setMaxInactiveInterval(long interval)修改。Session的超时时间也可以在web.xml文件中修改,另外通过invalidate()方法可以使Session失效。

    2.3Session的常用方法

      

    2.4Session与浏览器

      Http协议是无状态的,Session不能依据Http连接来判断是否是同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id,Session依据该Cookie来识别是否为同一用户。该Cookie为服务器自动生成的,它的maxAge属性一般为-1。同一机器的两个浏览器会生成两个不同的Session,但是由浏览器窗口内的链接、脚本等打开新窗口除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

      如果浏览器禁用Cookie或者不支持Cookie,就需要用到URL地址重写。

      URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的ID。  

    3.Cookie与Session区别

      Cookie只能保存ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8,GBK或者BASE64等方式编码。Cookie也不能直接存取Java对象。Session可以存取任何类型的数据。

      Session不存在敏感信息泄露的危险,如果选用Cookie,敏感信息尽量不要写到Cookie中。

      Cookie可以永久有效,Session不能实现。

      并发浏览的用户非常多时,最好使用Cookie。

      对于WAP应用, Session+URL地址重写。

      Cookie通过设置domain属性,可以实现跨域名(二级域名),Session则不会支持跨域名。

  • 相关阅读:
    phpredis
    nginx rewrite
    注册公司流程
    WebsitePanel 2.1.0beta配置部分
    Windows下cwRsync搭建步骤
    Windows 2008下部署Exchange Server 2007
    【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo
    Win2008远程多用户登陆的配置方法 另附详细设置: Windows server 2008 R2实现多用户远程连接
    IIS安全工具UrlScan介绍 ASP.NET 两种超强SQL 注入免费解决方案( 基于IIS,使用免费工具) 批改或隐藏IIS7.5的Server头信息 移除X-Powered-By,MVC,ASP.NET_SessionId 的 HTTP头或者cookie名称
    利用UDP19端口实施DOS攻击的真实案例
  • 原文地址:https://www.cnblogs.com/galway/p/4665676.html
Copyright © 2011-2022 走看看