IIS+Tomcat部署的wen应用,在浏览器访问服务的时候都会产生一名为session_id的cookie和一个JSESSIONID的cookie,JSESSIONID是tomcat自动产生的,那session_id呢?是自动产生的么?它是根据什么生成的,是一个新客户端访问服务器都会产生一个新的session_id么?

解决方案 »

  1.   

    HTTP协议(http://www.w3.org/Protocols/)是“一次性单向”协议。 
    服务端不能主动连接客户端,只能被动等待并答复客户端请求。客户端连接服务端,发出一个HTTP Request,服务端处理请求,并且返回一个HTTP Response给客户端,本次HTTP Request-Response Cycle结束。 
    我们看到,HTTP协议本身并不能支持服务端保存客户端的状态信息。于是,Web Server中引入了session的概念,用来保存客户端的状态信息。 
    这里用一个形象的比喻来解释session的工作方式。假设Web Server是一个商场的存包处,HTTP Request是一个顾客,第一次来到存包处,管理员把顾客的物品存放在某一个柜子里面(这个柜子就相当于Session),然后把一个号码牌交给这个顾客,作为取包凭证(这个号码牌就是Session ID)。顾客(HTTP Request)下一次来的时候,就要把号码牌(Session ID)交给存包处(Web Server)的管理员。管理员根据号码牌(Session ID)找到相应的柜子(Session),根据顾客(HTTP Request)的请求,Web Server可以取出、更换、添加柜子(Session)中的物品,Web Server也可以让顾客(HTTP Request)的号码牌和号码牌对应的柜子(Session)失效。顾客(HTTP Request)的忘性很大,管理员在顾客回去的时候(HTTP Response)都要重新提醒顾客记住自己的号码牌(Session ID)。这样,顾客(HTTP Request)下次来的时候,就又带着号码牌回来了。 
    我们可以看到,Session ID实际上是在客户端和服务端之间通过HTTP Request和HTTP Response传来传去的。 我们看到,号码牌(Session ID)必须包含在HTTP Request里面。关于HTTP Request的具体格式,请参见HTTP协议(http://www.w3.org/Protocols/)。这里只做一个简单的介绍。 
    在Java Web Server(即Servlet/JSP Server)中,Session ID用jsessionid表示(请参见Servlet规范)。 
    HTTP Request一般由3部分组成: 
    (1)Request Line 
    这一行由HTTP Method(如GET或POST)、URL、和HTTP版本号组成。 
    例如,GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1 
    GET http://www.google.com/search?q=Tomcat HTTP/1.1 
    POST http://www.google.com/search HTTP/1.1 
    GET http://www.somsite.com/menu.do;jsessionid=1001 HTTP/1.1 (2)Request Headers 
    这部分定义了一些重要的头部信息,如,浏览器的种类,语言,类型。Request Headers中还可以包括Cookie的定义。例如: 
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) 
    Accept-Language: en-us 
    Cookie: jsessionid=1001 (3)Message Body 
    如果HTTP Method是GET,那么Message Body为空。 
    如果HTTP Method是POST,说明这个HTTP Request是submit一个HTML Form的结果, 
    那么Message Body为HTML Form里面定义的Input属性。例如, 
    user=guest 
    password=guest 
    jsessionid=1001 
    主意,如果把HTML Form元素的Method属性改为GET。那么,Message Body为空,所有的Input属性都会加在URL的后面。你在浏览器的URL地址栏中会看到这些属性,类似于 
    http://www.somesite/login.do?user=guest&password=guest&jsessionid=1001 从理论上来说,这3个部分(Request URL,Cookie Header, Message Body)都可以用来存放Session ID。由于Message Body方法必须需要一个包含Session ID的HTML Form,所以这种方法不通用。 
    一般用来实现Session的方法有两种: 
    (1)URL重写。 
    Web Server在返回Response的时候,检查页面中所有的URL,包括所有的连接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。 
    下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。 
    (2)Cookie。 
    如果客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。 
    客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。 我们来看Tomcat5的源代码如何支持jsessionid。 
    org.apache.coyote.tomcat5.CoyoteResponse类的toEncoded()方法支持URL重写。 
    String toEncoded(String url, String sessionId) { 
    … 
            StringBuffer sb = new StringBuffer(path); 
            if( sb.length() > 0 ) { // jsessionid can't be first. 
                sb.append(";jsessionid="); 
                sb.append(sessionId); 
            } 
            sb.append(anchor); 
            sb.append(query); 
            return (sb.toString()); 
    } 我们来看org.apache.coyote.tomcat5.CoyoteRequest的两个方法configureSessionCookie() 
    doGetSession()用Cookie支持jsessionid.     /** 
         * Configures the given JSESSIONID cookie. 
         * 
         * @param cookie The JSESSIONID cookie to be configured 
         */ 
        protected void configureSessionCookie(Cookie cookie) { 
           … 
        }     HttpSession doGetSession(boolean create){ 
          … 
            // Creating a new session cookie based on that session 
            if ((session != null) && (getContext() != null) 
                   && getContext().getCookies()) { 
                Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME, 
                                           session.getId()); 
                configureSessionCookie(cookie); 
                ((HttpServletResponse) response).addCookie(cookie); 
            } 
          … 
        } Session的典型应用是存放用户的Login信息,如用户名,密码,权限角色等信息,应用程序(如Email服务、网上银行等系统)根据这些信息进行身份验证和权限验证 
      

  2.   

    w11x22b33,谢谢
    你说的这个是jseesionid的生成机制,我说的是名为session_id的cookie,这个不知道是不是tomcat生成的。
      

  3.   

    第一次访问时,服务器端发送带有sessionID信息的cookie,其响应头中有“Set-Cookie:   JSESSIONID=aQQxcAtUHWv9;   path=/”,而客户端第二次次访问时,IE依然会发送此cookie,内容为“Cookie:   JSESSIONID=aQQxcAtUHWv9”。
    应该是tomcat产生的。
      

  4.   

    Cookies现在经常被大家提到,那么到底什么是Cookies,它有什么作用呢?Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息     
        
      当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。从本质上讲,它可以看作是你的身份证。但Cookies不能作为代码执行,也不会传送病毒,且为你所专有,并只能由提供它的服务器来读取。保存的信息片断以"名/值"对(name-value   pairs)的形式储存,一个"名/值"对仅仅是一条命名的数据。一个网站只能取得它放在你的电脑中的信息,它无法从其它的Cookies文件中取得信息,也无法得到你的电脑上的其它任何东西。   Cookies中的内容大多数经过了加密处理,因此一般用户看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。       
        
        由于Cookies是我们浏览的网站传输到用户计算机硬盘中的文本文件或内存中的数据,因此它在硬盘中存放的位置与使用的操作系统和浏览器密切相关。在Windows   9X系统计算机中,Cookies文件的存放位置为C:/Windows/Cookies,在Windows   NT/2000/XP的计算机中,Cookies文件的存放位置为C:/Documents   and   Settings/用户名/Cookies。       
        
        硬盘中的Cookies文件可以被Web浏览器读取,它的命令格式为:用户名@网站地址[数字].txt。如笔者计算机中的一个Cookies文件名为:ch@163[1].txt。要注意的是:硬盘中的Cookies属于文本文件,不是程序。       
        
        Cookies的设置       
        
        你可以在IE的"工具/Internet选项"的"常规"选项卡中,选择"设置/查看文件",查看所有保存到你电脑里的Cookies。这些文件通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的域名。如果你使用NetsCape浏览器,则存放在"C:/PROGRAMFILES/NETS-   CAPE/USERS/"里面,与IE不同的是,NETSCAPE是使用一个Cookie文件记录所有网站的Cookies。       
        
        我们可对Cookie进行适当设置:打开"工具/Internet选项"中的"隐私"选项卡(注意该设置只在IE6.0中存在,其他版本IE可以单击"工具/Internet选项" "安全"标签中的"自定义级别"按钮,进行简单调整),调整Cookie的安全级别。通常情况,可以调整到"中高"或者"高"的位置。多数的论坛站点需要使用Cookie信息,如果你从来不去这些地方,可以将安全级调到"阻止所有Cookies";如果只是为了禁止个别网站的Cookie,可以单击"编辑"按钮,将要屏蔽的网站添加到列表中。在"高级"按钮选项中,你可以对第一方Cookie和第三方的Cookie进行设置,第一方Cookie是你正在浏览的网站的Cookie,第三方Cookie是非正在浏览的网站发给你的Cookie,通常要对第三方Cookie选择"拒绝"。你如果需要保存Cookie,可以使用IE的"导入导出"功能,打开"文件/导入导出",按提示操作即可。     
        
        
      Cookies的写入与读取       
        
        Cookies集合是附属于Response对象及Request对象的数据集合,使用时需要在前面加上Response或Request。       
        
        用于给客户机发送Cookies的语法通常为:       
        
        当给不存在的Cookies集合设置时,就会在客户机创建,如果该Cookies己存在,则会被代替。由于Cookies是作为HTTP传输的头信息的一部分发给客户机的,所以向客户机发送Cookies的代码一般放在发送给浏览器的HTML文件的标记之前。       
        
        如果用户要读取Cookies,则必须使用Request对象的Cookies集合,其使用方法是:   需要注意的是,只有在服务器未被下载任何数据给浏览器前,浏览器才能与Server进行Cookies集合的数据交换,一旦浏览器开始接收Server所下载的数据,Cookies的数据交换则停止,为了避免错误,要在程序和前面加上response.Buffer=True。     
      Cookies的应用       
        
        几乎所有的网站设计者在进行网站设计时都使用了Cookie,因为他们都想给浏览网站的用户提供一个更友好的、人文化的浏览环境,同时也能更加准确地收集访问者的信息。     
             
      网站浏览人数管理          
        
        由于代理服务器、缓存等的使用,唯一能帮助网站精确统计来访人数的方法就是为每个访问者建立一个唯一的ID。使用Cookie,网站可以完成以下工作:测定多少人访问过;测定访问者中有多少是新用户(即第一次来访),多少是老用户;测定一个用户多久访问一次网站。       
        
        通常情况下,网站设计者是借助后台数据库来实现以上目的的。当用户第一次访问该网站时,网站在数据库中建立一个新的ID,并把ID通过Cookie传送给用户。用户再次来访时,网站把该用户ID对应的计数器加1,得到用户的来访次数或判断用户是新用户还是老用户。       
        
        按照用户的喜好定制网页外观         
        
        有的网站设计者,为用户提供了改变网页内容、布局和颜色的权力,允许用户输入自己的信息,然后通过这些信息对网站的一些参数进行修改,以定制网页的外观。       
        
        在电子商务站点中实现诸如"购物篮"等功能       
        
        可以使用Cookie记录用户的ID,这样当你往"购物篮"中放了新东西时,网站就能记录下来,并在网站的数据库里对应着你的ID记录当你"买单"时,网站通过ID检索数据库中你的所有选择就能知道你的"购物篮"里有些什么。       
        
          在一般的事例中,网站的数据库能够保存的有你所选择的内容、你浏览过的网页、你在表单里填写的信息等;而包含有你的唯一ID的Cookie则保存在你的电脑里。     
        
      Cookies的缺陷     
        
        Cookie虽然被广泛的应用,并能做到一些使用其它技术不可能实现的功能。但也存在一些不够完美的方面,给应用带来不便。       
        
        多人共用一台电脑的问题       
        
        任何公共场合的电脑或者许多在办公室或家里使用的电脑,都会同时被两个以上的人使用。这样,当你用它在网上超市购物时,网上超市或网站会在这台机器上留下一个Cookie,将来也许就会有某个人试图使用你的账户购物,带来了不安全的可能。当然,在一些使用多用户操作系统如Windows   NT或UNIX的电脑上,这并不会成为一个问题。因为在多用户操作系统下不同的账户的Cookie分别放在不同的地方。       
      Cookies被删除时       
      

  5.   

    首先session是依赖于Cookie的,如果cookies被禁用,或者安全级别设置的高,那么session就失去了作用,必须进行url重写才能,cookie只要你访问页面就产生的。
    楼主你基本理解的是对的。
      

  6.   


    那如果我在系统中通过SSO请求另一个系统的资源,会产生新的session_id么?这里我并没有开一个新的浏览器。
      

  7.   

      xue xi le.  sui ran hai you xie mo hu
      

  8.   

    cookie是瀏覽器產生,session是web 服務器產生