Session和Cookie使用

Session

1.Session的生命周期

Session的生命周期(同一浏览器,无论是否关闭,都使用同一个session会话,直达session被销毁)

注意:

(1)浏览器关闭session是不会销毁的

(2)同一浏览器多个用户共用一个session(session存活时)

同一浏览器,登录两个用户,使用session获取用户信息,第二个用户会把第一个用户的信息覆盖掉

(3)默认的Tomcat是支持Session持久化的,即重启Tomcat Session仍然存在!!!!!

使Tomcat重启Session失效,修改Tomcat $TOMCAT_HOME$/conf/context.xml 文件解除下面注释

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />

1.1 session什么时候创建:

  Session一般存储在服务器的内存中,Sessinon在用户访问第一次访问服务器时创建(注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session)。当然,强制生成Session可使用request.getSession(true)方法

注意事项:

1 客户端第一次发送请求java服务器时,是不会产生JSESSIONID的

2 当客户端第一次向服务端请求session的时候,服务端通过调用request.getSession()的时候才会创建session,并且这个时候会在response的cookie中写入JSESSIONID=session.getId()  之后这台浏览器发送的请求时候都会带上这个cookie . 这样浏览器和服务器之间通过cookie中的JSESSIONID就产生了关联

3 当客户端第一次向服务端请求jsp的时候也会产生session

JSP默认自动创建session:<%@ page session="true"%>

1.2 session什么时候销毁:

  1.session的持有者(即客户端浏览器)在最大无活动等待时间(MaxInactiveInterval)内无任何响应或请求 ;

     设置方法有许多(这里随便写两种):
1.session.setMaxInactiveInterval(2 * 3600);  // Session保存两小时
2.web.xml里有:
            <session-config>
                <session-timeout>10</session-timeout>
            </session-config>

  2.调用Session的invalidate方法强制销毁。

  3.jsp服务器重起或发生中断(这个和tomcat服务器的配置有关(默认不销毁,可以设置全部销毁),重启默认前会把session写入文件里保存,重启后会读取session文件,所以session默认时间没过还是存在的)   
  注意:关闭浏览器并不会销毁session,默认下次开启浏览器会新建session,但是旧的session会在最大无活动等待时间后自动执行销毁。(文章后面教如何实现一直使用同一个session)

1.3 Session怎么识别用户(服务器怎么识别/区分用户):

  Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

      具体:当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set-Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务器),或Set-Cookie JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服务器)信息,此信息是服务器随机生成的,放在服务器内存里,为了标识唯一的客户端用户,内容不会重复,这就是sessionid.该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

  怎么实现关闭浏览器,再打开浏览器时候使用原来的session:

  或者关闭浏览器,再打开浏览器还是登陆的状态:

  或者重新打开浏览器没有新建session:

  或者使用Cookie实现短时间内不用重新登陆(当然后台也没有自动登陆,和自动登陆有区别):

  方法:因为保存Sessionid的cookie是临时的(浏览器关闭就会销毁),所以我们自己手动创建一个持久化的cookie,用来保存sessionid;

    //以下是持久化cookie,保存sessionid,实现关闭浏览器,重新打开还是使用原来的session
    session.setMaxInactiveInterval(2 * 3600);  // Session保存两小时
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(2 * 3600);  // 客户端的JSESSIONID也保存两小时
    cookie.setPath("/");        
    response.addCookie(cookie);

   (注意,第一次访问时候遍历cookie只有一个cookie,刷新第二次访问遍历却有两个cookie,我想:第一次访问自动生成的临时cookie还没有返回给浏览器,第一次访问结束了,浏览器才有了临时的cookie,和我们手动持久化的cookie,所以第二次访问遍历获取了两个cookie,都有相同的sessionid属性。关闭浏览器,再访问,遍历只有一个cookie,因为临时的cookie关闭浏览器时候销毁了,

现在只使用持久化的cookie了,里面有sessionid属性)

1.4 如果Cookie功能禁用,我们怎么识别用户?

      Java Web提供了另一种解决方案:URL地址重写。

  URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。

  注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。

2.Session细节:

      1> 服务器让浏览器记住sessionID的cookie 默认过期时间是 (-1)

      => 关闭浏览器 cookie就丢失 ==>  cookie丢失 sessionID就丢失 ==> 找不到服务器的session 
    2> session中除了 4个操作 map的方法之外,还有哪些方法.
        long getCreationTime()   获得创建时间
        String getId()    获得sessionID
        long getLastAccessedTime()   获得最后一次访问时间
        int  getMaxInactiveInterval()  获得session的寿命
        void setMaxInactiveInterval(int interval)   设置session的过期时间 
        void invalidate()   让session立即失效
        boolean isNew()  
    3> 关于设置session的最大有效时间
        默认是30分钟. ==> 在tomcat的web.xml中 <session-config> 配置的.
        如何修改session的过期时间?
            1.修改在tomcat的web.xml中 <session-config> ==> 影响服务器中的所有项目
            2.在项目的web.xml中 加入<session-config> 配置.==> 影响的是当前项目
            3.通过setMaxInactiveInterval(int interval)方法设置.==> 当前操作的session
            
    4>(了解内容)URL重写
        如果浏览器 禁用cookie功能不能保存任何cookie.那么session技术要是用 cookie来保存sessionID. 没有cookie怎么保存?
            使用url重写解决该问题.
            将页面中所有的连接 末尾全都加上 cookieid的参数. 这样用户点击连接访问网站,通过url把SeesionID带到了服务器.这样就解决了.
            但是 互联网行业没有这么干的.
 

Cookie

1.Cookie使用:

//1.添加cookie到浏览器
    //新建一个cookie(键值对)
    Cookie cookie = new Cookie("name", "tom");
    //将cookie 添加到响应中
    response.addCookie(cookie);
//2.浏览器发送cookie到服务器,如何取
    //获得所有浏览器发送的cookie
    Cookie[] cookies  = request.getCookies();
    //遍历并判断我们要找的cookie
    if(cookies!=null && cookies.length>0){
        for(Cookie c : cookies){
            if(c.getName().equals("name")){
            System.out.println("获得的cookie:"+c.getName()+":"+c.getValue());
      }
}
}


cookie原理.
    让浏览器记住键值对.是向响应头中添加一下头即可:
        set-Cookie:name=tom;
    浏览器记住之后,向服务器发送键值对,是在请求头中添加下面的信息:
        Cookie: name=tom;


2.cookie细节问题:


    1.浏览器记住键值对
        让浏览器记住键值对.是向响应头中添加一下头即可:
        set-Cookie:name=tom;
        浏览器记住之后,向服务器发送键值对,是在请求头中添加下面的信息:
        Cookie: name=tom;
    2.有效时间如何设置?
        //设置cookie的最大有效时间
        1>设置一个正数,标示最大有效时间.单位是秒
        //cookie.setMaxAge(60*60);
        2>设置为-1 , 就是相当于默认有效时间, 浏览器关闭就消失.
        //cookie.setMaxAge(-1);
        3> 标示cookie的有效时间为0.发送到浏览器就消失了.
                //利用有效时间为0 这件事,我们可以做删除cookie的操作.
                // 因为同一个路径 ,不能存在相同的cookie(键相同).
                // 我们可以通过覆盖的方式,设置有效时间为0. 删除cookie
                cookie.setMaxAge(0);
        
    3.浏览器在什么情况下发送cookie(路径)
            cookie的默认路径就是发送cookie的servlet所在目录.
                /Day09-cookie 
                /Day09-cookie/abc/xxxServlet
            访问路径如果是cookie路径的子路径那么,浏览器就会把该cookie告诉服务器.
    4.cookie中的域 

Cookie的作用在于充当一个信息载体在Server端和Browser端进行信息传递,而Cookie一般是以域名为分割的,例如a.xxx.com与b.xxx.com的Cookie是不能互相访问的,但是子域名是可以访问上级域名的Cookie的。即a.xxx.com和b.xxx.com是可以访问xxx.com下的Cookie的
        想要以下三个 主机和主机下的项目能共享一个cookie.
            www.baidu.com
            music.baidu.com
            map.baidu.com
        完成两步即可:    
            1.设置cookie的域为 ".baidu.com"
            2.设置cookie路径 为: "/" 
        以上就是跨主机访问cookie.不常用.

猜你喜欢

转载自blog.csdn.net/Bruce_Up/article/details/84335861