• Java精选笔记_会话技术


    会话及其会话技术

    会话概述


    指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程。


    会话:从浏览器开启到浏览器关闭。会话技术:用来保存在会话期间 浏览器和服务器所产生的数据。
    在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。

    Cookie对象


    什么是Cookie


    服务器和客户端之间传递的一张小纸条,cookie就是用来传递和存储数据。
        cookie由服务器端写的, cookie由客户端保存的。
        cookie由响应头  Set-Cookie:k1=v1; path=  形式传递给浏览器
        cookie由请求头  Cookie:k1=v1; k2=v2; k3=v3; ...形式传递给服务器

    在Web应用中当用户通过浏览器访问Web服务器时,服务器会给客户发送一些信息,这些信息都保存在Cookie中。这样,当该浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
    服务器向客户端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段。Set-Cookie头字段中设置的Cookie遵循一定的语法格式,具体示例如下:
    Set-Cookie: user=itcast; Path=/;

    在HttpServletResponse接口中定义了一个addCookie方法来向浏览器发送Cookie消息(也就是Cookie对象),在HttpServletRequest接口中定义了一个getCookies方法来读取浏览器发送的Web服务器的所有Cookie消息。Cookie类中定义了生成和提取Cookie消息的各个属性的方法。

    添加cookie 的方式


     1.Cookie c = new Cookie("uname",URLEncoder.encode("小陈", "utf-8"));
        response.addCookie(c);
        Cookie的value不能有中文,需要使用URL对中文进行编码。
     2.response.addHeader("Set-Cookie","uname1=xiaochen")
        //把cookie追加到响应头上
        response.stHeader("Set-Cookie","uname1=xiaochen")
        //设置头字段

    Cookie操作


    为了封装Cookie信息,在Servlet API中提供了一个javax.servlet.http.Cookie类,该类包含了生成Cookie信息和提取Cookie信息各个属性的方法。

    1、构造方法
       Cookie类有且仅有一个构造方法,具体语法格式如下:
    public Cookie(java.lang.String name,java.lang.String value)
    需要注意的是,Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任何值,创建后允许被修改。

    2、Cookie类的常用方法
    setMaxAge(int expiry)和getMaxAge()方法
    上面的这两个方法用于设置和返回Cookie在浏览器上保持有效的秒数。
    如果设置的值为一个正整数时,浏览器会将Cookie信息保存在本地硬盘中。从当前时间开始,在没有超过指定的秒数之前,这个Cookie都保持有效,并且同一台计算机上运行的该浏览器都可以使用这个Cookie信息。
    如果设置值为负整数时,浏览器会将Cookie信息保存在的缓存中,当浏览器关闭时,Cookie信息会被删除。
    如果设置值为0时,则表示通知浏览器立即删除这个Cookie信息。
    默认情况下,Max-Age属性的值是-1。


    setPath(String uri)和getPath()方法


    上面的这两个方法是针对Cookie的Path属性的。
    如果创建的某个Cookie对象没有设置Path属性,那么该Cookie只对当前访问路径所属的目录及其子目录有效。
    如果想让某个Cookie项对站点的所有目录下的访问路径都有效,应调用Cookie对象的setPath()方法将其Path属性设置为“/”。

    setDomain(String pattern)和getDomain()方法


    上面的这两个方法是针对Cookie的Domain属性的。
    Domain属性是用来指定浏览器访问的域。例如,传智播客的域为“itcast.cn”。那么,当设置Domain属性时,其值必须以“.”开头,如Domain=.itcast.cn。
    默认情况下,Domain属性的值为当前主机名,浏览器在访问当前主机下的资源时,都会将Cookie信息回送给服务器。需要注意的是,Domain属性的值是不区分大小写的。

    其他常用方法


        getName方法 用于获得Cookie的名称
        setValue和getValue方法 分别用于设置和获得Cookie的值
        setMaxAge和getMaxAge方法 分别用于设置和获得Cookie在客户机的有效时间,也就是在在客户机上的有效秒数
        setPath和getPath方法 分别用于设置和获得当前Cookie的有效Web路径
        setDomain和getDomain方法 分别用于设置和获得当前Cookie的有效域
        setComment和getComment方法 分别用于设置和返回当前Cookie的注释部分
        setVersion与getVersion方法 分别用于设置和获得当前Cookie的协议版本
        setSecure和getSecure方法 分别用于设置和获得当前Cookie是否只能使用安全的协议传输Cookie



    Cookie的持久化


    1.持久化:就是把数据从内存中写到硬盘上
        cookie默认是在浏览器缓存中【内存中】
        cookie通过持久化设置,可以保存在硬盘上。
    2.设置方法:
        cookie.setMaxAge(int sec);      设置cookie最大生存时间,单位为秒
        -1    保存在浏览器缓存中。 【默认,不需要设置】
        >0    保存到浏览器的硬盘上。  【保存位置由各个浏览器自己制定】
         0     cookie立刻过期。删除一个cookie
        已经过期的cookie 浏览器是不会传递。

    cookie的唯一性标识:

    cookie   -http 域名  -path路径  -cookie的name   相同时,cookie才相同。
    实例1:域名不同,有效路径相同,cookie的name相同,  不是一个cookie,分开保存
    cookie1: k1=v1   http://192.168.113.11/WEB16/
    cookie2: k1=v1 http://192.168.113.111/WEB16/

    实例2:域名相同,有效路径不同,cookie的name相同,  不是一个cookie,分开保存
    cookie1: k1=v1   http://192.168.113.111/WEB15/
    cookie2: k1=v1 http://192.168.113.111/WEB16/

    实例3:域名相同,有效路径相同,cookie的name不同,  不是一个cookie,分开保存
    cookie1: k1=v1   http://192.168.113.111/WEB16/
    cookie2: k2=v1 http://192.168.113.111/WEB16/

    实例4:域名相同,有效路径相同,cookie的name相同,  是一个cookie,新cookie覆盖老cookie
    cookie1: k1=v1   http://192.168.113.111/WEB16/
    cookie2: k1=v1 http://192.168.113.111/WEB16/



    cookie使用有注意事项


    cookie不支持直接存中文。    【URL编码编码中文】
    【用URLEncoder编辑,保存cookie】【用URLDecoder解码,取出cookie值】
    cookie并不是javaEE独有的,而是由HTTP协议指定的,只要遵循HTTP协议,都可以用cookie技术


    Cookie的value是有长度限制的,4KB。   【建议cookie都是存短少数据,一般都是标识】
    一个浏览器接收的cookie也是有上限。300个  【为了保证程序效率,尽量经常清cookie】
    一个网站存储的cookie也是有上限的。30个    【cookie使用的时候要慎重,不要写太多个】

    Session对象


    什么是Session


    session对象用来保存每个用户的用户信息和会话状态。session对象由服务器端自动创建,可以跟踪每个用户的操作状态。
    用户首次登录系统时服务器会自动给用户分配唯一标识的session id,可以用来区分开其他用户。相对于Cookie,session是存储在服务器端的会话,相对安全,而且其存储长度限制也大大的扩大了。


    session概述


    session保存在服务端的会话技术      域对象,MAP
    其它域对象:ServletContext,session,request
    这个域对象 仅对当前的会话有效!!!不能跨浏览器。

    原理

    session实现依赖于cookie【会话级别】,将JSESSIONID存入Cookie中。
    会话关闭了,cookie被销毁,sessionid丢失,但是session并没有销毁。


    HttpSession API


    在Servlet中使用HttpSession对象来描述Session。一个HttpSession对象就是一个Session。使用HttpServletRequest接口的getSession方法来获得一个HttpSession对象。
    Session是与每个请求消息紧密相关的,为此HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式,具体如下:
        public HttpSession getSession(boolean create)
        public HttpSession getSession()
    上面重载的两个方法都用于返回与当前请求相关的HttpSession对象。


        public HttpSession getSession(boolean create)
    该方法根据传递的参数来判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null。


        public HttpSession getSession()
    该方法则相当于上一个方法参数为true时的情况,在相关的HttpSession对象不存在时总是创建新的HttpSession对象。
    需要注意的是,由于getSession()方法可能会产生发送会话标识号的Cookie头字段,因此必须在发送任何响应内容之前调用getSession()方法
        getId方法 用于返回当前HttpSession对象的SessionID
        getCreationTime方法 用于返回当前的HttpSession对象的创建时间
        getLastAccessedTime方法 用于返回当前HttpSession对象的上一次被访问的时间
        setMaxInactiveInterval和
        getMaxInactiveInterval方法 分别用来设置和返回当前HttpSession对象的可空闲的最长时间(单位:秒),这个时间也就是当前会话的有效间隔
        isNew方法 用来判断当前的HttpSession对象是否是新创建的,如果是则返回true,否则返回false
        isvalidate方法 用于强制当前的HttpSession对象失效,这样Web服务器可以立即释放该HttpSession对象
        getServletContext方法 用于返回当前HttpSession对象所属的Web应用程序的ServletContext对象
        setAttribute方法 用于将一个String类型的ID和一个对象相关联,并将其保存在当前的HttpSession对象中
        getAttribute方法 用于返回一个和String类型的ID相关联的对象
        remoteAttribute方法 用于删除与一个String类型的ID相关联的对象



    Session超时管理


    Web服务器采用了“超时限制”的办法来判断客户端是否还在继续访问。在一定时间内,如果某个客户端一直没有请求访问,那么,Web服务器就会认为该客户端已经结束请求,并且将与该客户端会话所对应的HttpSession对象变成垃圾对象,等待垃圾收集器将其从内存中彻底清除。

    反之,如果浏览器超时后,再次向服务器发出请求访问,那么,Web服务器则会创建一个新的HttpSession对象,并为其分配一个新的ID属性。

    在会话过程中,会话的有效时间可以在web.xml文件中设置,其默认值由Servlet容器定义。在<tomcat安装目录>confweb.xml文件中,可以找到如下一段配置信息:
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    以分钟为单位
    如果将<session-timeout>元素中的时间值设置成0或一个负数,则表示会话永不超时。


    由于<tomcat安装目录>confweb.xml文件对站点内的所有Web应用程序都起作用,因此,如果想单独设置某个Web应用程序的会话超时间隔,则需要在自己应用的web.xml文件中进行设置。
    需要注意的是,要想使Session失效,除了可以等待会话时间超时外,还可以通过invalidate()方法强制使会话失效。


    通过Cookie跟踪Session



    客户端必须通过一个SessionID才能找到以前在服务端创建的某一个HttpSession对象。通过SessionID找HttpSession对象的过程也叫做Session跟踪。

    一般客户端的SessionID通过HTTP请求消息头的Cookie字段发送给服务端,然后服务端通过getSession方法读取Cookie字段的值,以确定是否需要新建一个HttpSession对象,还是获得一个已经存在的HttpSession对象,或是什么都不做,直接返回null。

    当HttpSession对象是第一次创建时,向这个对象中写一个字符串值。如果HttpSession对象不是第一次创建,那么就将保存在HttpSession对象中的字符串值输出到客户端


    通过重写URL跟踪Session


    如果客户端浏览器不支持Cookie或是将Cookie功能关闭,那么就无法使用Cookie来传递SessionID。为了在这种情况下仍然可以使用Session,Servlet规范提供了一种补充会话管理机制。这种管理机制允许在Cookie无法工作的情况下使用URL参数来传递SessionID。


    要想通过URL来发送SessionID,必须要重写URL。HttpServletResponse提供了两个方法用于重写URL
        encodeURL方法  用于对所有内嵌在Servlet中的URL进行重写
        encodeRedirect方法  用于对sendRedirect方法所使用的URL进行重写

  • 相关阅读:
    strcmp()比较函数和strcasecmp()和strnatcmp()
    substr()函数
    改变字符串中的字母大小写
    explode()与相反函数 implode() 和join()
    PHP nl2br() 函数
    PHP trim() 函数
    PHP的count(数组)和strlen(字符串)的内部实现
    变量处理函数库
    php中定义数组的方法
    80端口的烦恼:[3]清除NT Kernel占用80端口
  • 原文地址:https://www.cnblogs.com/justdoitba/p/7582133.html
Copyright © 2020-2023  润新知