Session和Cookie

来源:互联网 发布:c多线程编程实例 pdf 编辑:程序博客网 时间:2024/06/03 12:55
Session是属于服务器端生成和管理的对象,由于HTTP请求本身是无状态的,因此在服务器端使用Session来管理HTTP请求的状态。服务器端会把session对象存在内存中。

Cookie是属于浏览器前端的数据存储方案,数据存储于电脑本地磁盘上,在访问某个域名的服务时,浏览器会自动加载属于当前域的cookie数据,将cookie信息发送到服务器端。


[Cookie和Session的关联]

        有一个名为"JESSIONID"的Cookie,客户端使用这个Cookie的值来表示对应的服务器端Session对象的ID。
        在tomcat的实现中,如果服务器为当前请求生成了一个Session对象,则会自动在对应的response对象中添加一个这样的Cookie对象。
        当请求中带有名为"JESSIONID"的cookie时,使用request对象来获取session对象时,就使用这个cookie的值去寻找已经存在的session对象。这样无状态的HTTP请求,就可以通过Cookie和Session对象关联起来

[Cookie的数据]

          除了前述的名为"JESSIONID"的cookie是由tomcat自动创建和添加外,其它类型的Cookie需要开发人员显示地创建,并添加到HttpServletResponse对象中。
          Cookie本身存在不同的生命周期。

[问题]
1、在浏览器禁用Cookie的情况下,如何能正确地将某次请求和session对象关联起来?

 经自己的测试环境中,在浏览器禁用Cookie的情况下,在servlet中每次使用request.getSession(true)时,返回的session对象是不相同的。这是因为在浏览器禁用了Cookie的情况下,无法通过设置请求中的Cookie把JESSIONID的值传过来,所以无法采用默认的方式根据sessionId的值来获取session对象,每次都会创建一个新的session对象。

可以使用url重写,将sessionId作为一个参数传递到服务器端,举例如下 http://xxx:8080/session;jsessionid=13jl1jkuoqv0y1p8kw571d1rx0

只需要采用合适的方式,将sessionId传递到后端即可



[代码实例测试]
          在代码的实际测试中,实际的类对象分别如下
           request class:org.eclipse.jetty.server.Request
     response class:org.eclipse.jetty.server.Response
     session class:org.eclipse.jetty.server.session.HashedSession
     session manager class:org.eclipse.jetty.server.session.HashSessionManager


从代码上看,在通过请求对象获取Session对象时,如果当前请求对象中没有session,则为当前请求创建一个session对象。并且会在返回对象中设置session对应的cookie
public HttpSession getSession(boolean create)
    {
        if (_sessionManager ==null && create)
            throw new IllegalStateException("No SessionManager");
       
        if (_session != null && _sessionManager!= null && _sessionManager.isValid(_session ))
            return _session ;
       
        _session= null;
       
        String id=getRequestedSessionId();
       
        if (id != null && _sessionManager!= null)
        {
            _session= _sessionManager.getHttpSession(id);
            if (_session == null && !create)
                return null ;
        }
       
        if (_session == null && _sessionManager!= null && create )
        {
            _session= _sessionManager.newHttpSession(this);
            HttpCookie cookie=_sessionManager.getSessionCookie(_session ,getContextPath(),isSecure());
            if (cookie!=null)
                _connection.getResponse().addCookie(cookie);
        }
       
        return _session ;
    }
1 0