??xml version="1.0" encoding="utf-8" standalone="yes"?>超碰在线中文字幕,亚洲国产一区二区三区在线观看,国产韩日影视精品http://www.aygfsteel.com/freeman1984/category/43930.html STANDING ON THE SHOULDERS OF GIANTSzh-cnMon, 24 Dec 2012 20:16:05 GMTMon, 24 Dec 2012 20:16:05 GMT60关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和?/title><link>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Mon, 24 Dec 2012 07:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/393402.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/393402.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/393402.html</trackback:ping><description><![CDATA[     摘要: 关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和?nbsp; <a href='http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html'>阅读全文</a><img src ="http://www.aygfsteel.com/freeman1984/aggbug/393402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2012-12-24 15:16 <a href="http://www.aygfsteel.com/freeman1984/archive/2012/12/24/393402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数字证书原理(?http://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.html疯狂疯狂Tue, 24 Jul 2012 02:35:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.htmlhttp://www.aygfsteel.com/freeman1984/comments/383817.htmlhttp://www.aygfsteel.com/freeman1984/archive/2012/07/24/383817.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/383817.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/383817.html阅读全文

疯狂 2012-07-24 10:35 发表评论
]]>
OAuth?/title><link>http://www.aygfsteel.com/freeman1984/archive/2011/07/29/355312.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 29 Jul 2011 03:19:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2011/07/29/355312.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/355312.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2011/07/29/355312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/355312.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/355312.html</trackback:ping><description><![CDATA[<h1 id="firstHeading" class="firstHeading"><!-- /jumpto --><!-- bodytext --> </h1> <div id="wmqeeuq" class="floatright"></div> <p><strong>OAuth</strong>Q开放授权)是一?font color="#ba0000">开放标?/font>Q允许用戯W三方应用访问该用户在某一|站上存储的U密的资源(如照片,视频Q联pMh列表Q,而无需用户名和密码提供给W三方应用?/p> <p>OAuth允许用户提供一个o牌,而不是用户名和密码来讉K他们存放在特定服务提供者的数据。每一个o牌授权一个特定的|站Q例如,视频~辑|站)在特定的时段Q例如,接下来的2时内)内访问特定的资源Q例如仅仅是某一相册中的视频Q。这POAuth允许用户授权W三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的讉K许可或他们数据的所有内宏V?/p> <p>OAuth是OpenID的一个补充,但是完全不同的服务?/p> <h2><span id=".E8.AE.A4.E8.AF.81.E5.92.8C.E6.8E.88.E6.9D.83.E8.BF.87.E7.A8.8B" class="mw-headline">认证和授权过E?/span></h2> <p>在认证和授权的过E中涉及的三方包括:</p> <div> <ul><li><strong>服务提供?/strong>Q用户用服务提供方来存储受保护的资源,如照片,视频Q联pMh列表?/li><li><strong>用户</strong>Q存攑֜服务提供方的受保护的资源的拥有者?/li><li><strong>客户?/strong>Q要讉K服务提供方资源的W三方应用,通常是网站,如提供照片打印服务的|站。在认证q程之前Q客L要向服务提供者申请客L标识?/li></ul></div> <p>使用OAuthq行认证和授权的q程如下所C?</p> <ol><li><strong>用户</strong>讉K<strong>客户?/strong>的网站,x作用户存攑֜<strong>服务提供?/strong>的资源?/li><li><strong>客户?/strong>?strong>服务提供?/strong>h一个时o牌?/li><li><strong>服务提供?/strong>验证<strong>客户?/strong>的n份后Q授予一个时o牌?/li><li><strong>客户?/strong>获得临时令牌后,用户引D<strong>服务提供?/strong>的授权页面请求用h权。在q个q程中将临时令牌和客L的回调连接发送给<strong>服务提供?/strong>?/li><li><strong>用户</strong>?strong>服务提供?/strong>的网上输入用户名和密码Q然后授权该<strong>客户?/strong>讉K所h的资源?/li><li>授权成功后,<strong>服务提供?/strong>引导<strong>用户</strong>q回<strong>客户?/strong>的网c?/li><li><strong>客户?/strong>Ҏ临时令牌?strong>服务提供?/strong>那里获取讉K令牌?/li><li><strong>服务提供?/strong>Ҏ临时令牌?strong>用户</strong>的授权情冉|?strong>客户?/strong>讉K令牌?/li><li><strong>客户?/strong>使用获取的访问o牌访问存攑֜<strong>服务提供?/strong>上的受保护的资源?/li></ol> <p>新浪oauth认证说明Q?br /><a >http://open.weibo.com/wiki/Oauth</a><br />豆瓣oauth认证Q?br /><a >http://www.douban.com/service/apidoc/auth</a></p><img src ="http://www.aygfsteel.com/freeman1984/aggbug/355312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">疯狂</a> 2011-07-29 11:19 <a href="http://www.aygfsteel.com/freeman1984/archive/2011/07/29/355312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat httpshttp://www.aygfsteel.com/freeman1984/archive/2011/06/25/353006.html疯狂疯狂Sat, 25 Jun 2011 15:06:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/06/25/353006.htmlhttp://www.aygfsteel.com/freeman1984/comments/353006.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/06/25/353006.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/353006.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/353006.htmlHTTPSQ全UͼHypertext Transfer Protocol over Secure Socket LayerQ,是以安全为目标的HTTP通道Q简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基是SSLQ因此加?/p>

的详l内容就需要SSL
  SSL协议的握手过E?br />SSL 协议既用C公钥加密技术又用到了对U加密技术,对称加密技术虽然比公钥加密技术的速度快,可是公钥加密技术提供了更好的n份认证技术。SSL 的握手协议非常有效的让客户和?/p>

务器之间完成怺之间的n份认证,其主要过E如下:   
①客户端的览器向服务器传送客L SSL 协议的版本号Q加密算法的U类Q生的随机敎ͼ以及其他服务器和客户端之间通讯所需要的各种信息?  
②服务器向客户端传?SSL 协议的版本号Q加密算法的U类Q随机数以及其他相关信息Q同时服务器q将向客L传送自q证书?  
③客户利用服务器传q来的信息验证服务器的合法性,服务器的合法性包括:证书是否q期Q发行服务器证书?CA 是否可靠Q发行者证书的公钥能否正确解开服务器证书的“发行者的数字

{֐”Q服务器证书上的域名是否和服务器的实际域名相匚w。如果合法性验证没有通过Q通讯断开Q如果合法性验证通过Q将l箋q行W四步?  
④用户端随Z生一个用于后面通讯?#8220;对称密码”Q然后用服务器的公钥Q服务器的公钥从步骤②中的服务器的证书中获得)对其加密Q然后将加密后的“预主密码”传给服务器?  
⑤如果服务器要求客Lw䆾认证Q在握手q程中ؓ可选)Q用户可以徏立一个随机数然后对其q行数据{֐Q将q个含有{֐的随机数和客戯q证书以及加密q的“预主密码”一起传

l服务器?  
⑥如果服务器要求客Lw䆾认证Q服务器必须验客戯书和{֐随机数的合法性,具体的合法性验证过E包括:客户的证书用日期是否有效,为客h供证书的CA 是否可靠Q发行CA

的公钥能否正解开客户证书的发?CA 的数字签名,查客L证书是否在证书废止列表(CRLQ中。检验如果没有通过Q通讯立刻中断Q如果验证通过Q服务器用自己的私钥解开加密?/p>

“预主密码”Q然后执行一pd步骤来生主通讯密码Q客L也将通过同样的方法生相同的主通讯密码Q?  
⑦服务器和客户端用相同的主密码?#8220;通话密码”Q一个对U密钥用?SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯q程中还要完成数据通讯的完整性,防止数据通讯中的M

变化?  
⑧客户端向服务器端发出信息Q指明后面的数据通讯用的步骤⑦中的d码ؓ对称密钥Q同旉知服务器客L的握手过E结束?  
⑨服务器向客户端发Z息,指明后面的数据通讯用的步骤⑦中的d码ؓ对称密钥Q同旉知客户端服务器端的握手q程l束?  
⑩SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始用相同的对称密钥q行数据通讯Q同时进行通讯完整性的验?/p>

 


下面是在tomcat下实现httpsQ用jdk自带的keytool工具生成自签名证书?/p>

1 生成keystore文gQkeystore文g用来存储密钥和证?br />   keystore的详l参数可使用 可用keystore命o查看?br />  
keytool -genkeypair -keyalg rsa -keysize 2048 -sigalg sha1withrsa -validity 3600 -alias www.joe.com -keystore e:\ssl\joe.keystore
输入keystore密码Q?br />再次输入新密?
您的名字与姓氏是什么?
  [Unknown]Q?nbsp; www.joe.com
您的l织单位名称是什么?
  [Unknown]Q?nbsp; joe
您的l织名称是什么?
  [Unknown]Q?nbsp; joe
您所在的城市或区域名U是什么?
  [Unknown]Q?nbsp; bj
您所在的州或省䆾名称是什么?
  [Unknown]Q?nbsp; bj
该单位的两字母国家代码是什?br />  [Unknown]Q?nbsp; cn
CN=www.joe.com, OU=joe, O=joe, L=bj, ST=bj, C=cn 正确吗?
  [否]Q?nbsp; y

输入<www.joe.com>的主密码
        Q如果和 keystore 密码相同Q按回RQ:
2 导出自签名证书。正是^台需要导出csr文gq去权威的ca认证机构获取受信任证书,一般是收费的?br />   keytool -exportcert -alias www.joe.com -keystore e:\ssl\joe.keystore -file e:\ssl\joe.cer -rfc
输入keystore密码Q?br />保存在文件中的认?<e:\ssl\joe.cer>
下面配置tomcat(server.xml)使其支持https.
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"  keystoreFile="conf/joe.keystore" keystorePass="123456"/>
   

3 修改操作pȝhost文gQ添?27.0.0.1 www.joe.com

4 新徏web应用httpstest
q添加indexjsp:
 <body>
    <%
     for(Enumeration en = request.getAttributeNames();en.hasMoreElements();){
     String name = (String)en.nextElement();
     out.println(name);
     out.println("="+request.getAttribute(name));
     out.println();
     }
    %>
  </body>

5 Z让浏览器信Q我们的证书,需要在览器导入我们的证书ZL证书?br />6 讉KQ?a >https://www.joe.com/httpstest
输出Q?br />javax.servlet.request.ssl_session =4e05eb849ac41a45b56725488b68c28cc8c2ea94e2ec599852e1665297b2822b
javax.servlet.request.key_size =128
javax.servlet.request.cipher_suite =SSL_RSA_WITH_RC4_128_MD5 (通讯的加密信息,由浏览器和服务器协商定)?/p>

 



疯狂 2011-06-25 23:06 发表评论
]]>
WEB应用中的w䆾验证(1)--基本w䆾验证BASIC authorization method http://www.aygfsteel.com/freeman1984/archive/2011/03/22/346772.html疯狂疯狂Tue, 22 Mar 2011 10:33:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2011/03/22/346772.htmlhttp://www.aygfsteel.com/freeman1984/comments/346772.htmlhttp://www.aygfsteel.com/freeman1984/archive/2011/03/22/346772.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/346772.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/346772.html在Q何一UWEB应用开发中Q不论大中小规模的,每个开发者都会遇C些需要保护程序数据的问题Q涉及到用户的LOGIN ID和PASSWORD。那么如何执行验证方式更好呢Q实际上Q有很多方式来实现。在本文里,我们不会把所有的验证Ҏ都考虑刎ͼ我们的目的是让你学会如何以最单最方便的验证方法来完成。下面将讨论基本验证方式之一QBASIC authorization methodQ?/p>

要搭建整个流E需要四个阶D:

一、徏立测试用数据?br />         我们q里用Mysqlq行试Q其他数据库完全一栗?br />     1、创建用戯
            CREATE TABLE users (
                  id int(11) NOT NULL auto_increment,
                    username varchar(20) NOT NULL,
                    password varchar(20) NOT NULL,
                    PRIMARY KEY  (id)
               )

    2、创建权限表Q此事例中用不到Q?br />            CREATE TABLE roles(
                    id int(11) NOT NULL auto_increment,
                    rolename varchar(20) NOT NULL,
                    PRIMARY KEY  (id)
               )
               
    3、创建用P权限对应?br />        CREATE TABLE user_roles (
          id int(11) NOT NULL auto_increment,
          username varchar(20) NOT NULL,
          rolename varchar(20) NOT NULL,
          PRIMARY KEY  (id)
        )
        
    4、插入数?br />        insert into users(username,password) values('zhangdongyu', 'loveyuanyuan')
       insert into roles(rolename) values('manager')
       insert into user_roles(username,rolename) values('zhangdongyu', 'manager')
       
二、修?{tomcat}\conf\server.xml
  扑ֈ
   <!--
      <Realm className="org.apache.catalina.realm.MemoryRealm" />
      -->
     
    在上面这句话下面d一下内容:
    <Realm
      className="org.apache.catalina.realm.JDBCRealm"
      debug="99"
      driverName="org.gjt.mm.mysql.Driver"
      connectionURL="jdbc:mysql://localhost/weblogin" <!--数据库连接地址-->
      connectionName="root"              <!--数据库用户名-->
           connectionPassword="123"            <!--数据库密?->
          userTable="users"                <!--用户?->
           userNameCol="username"              <!--用户名列-->
           userCredCol="password"             <!--密码?->  
           userRoleTable="user_roles"            <!--用户权限对应?->
           roleNameCol="rolename"              <!--权限?->
    />   

三、创建工E?br />   在Eclipse创徏一个web工程sercurityTestQ在WebRoot下面创徏一个文件夹admin(也可在里面徏立几个文?


  Eclipse截图


  在web.xml文g中添加以下片D:
    <security-constraint>
      <web-resource-collection>
       <web-resource-name>Web Demo</web-resource-name>
       <url-pattern>/admin/*</url-pattern>
      </web-resource-collection>
      <auth-constraint>
       <role-name>manager</role-name>
      </auth-constraint>
     </security-constraint>
    <login-config>
      <auth-method>BASIC</auth-method>
      <realm-name>Web Demo</realm-name>
    </login-config>

四、重启TomcatQ讄生效

ȝ试Q?br />   通过上面的四部分配置Q当你再ơ访问程序中受保护的地址Q如:http://localhost/sercurityTest/admin?br />   会弹出验证对话框Q让你输入用户名和密码,只有输入库中的用户名密码q且该用hmanager权限时才能进
  入受保护目录?img style="width: 322px; height: 235px" alt="弹出验证" src="http://p.blog.csdn.net/images/p_blog_csdn_net/swengineer/2.jpg" width="272" height="201" />


转蝲自:http://blog.csdn.net/swengineer/archive/2006/12/01/1424020.aspx

疯狂 2011-03-22 18:33 发表评论
]]>
Cookie和Sessionhttp://www.aygfsteel.com/freeman1984/archive/2010/09/09/331501.html疯狂疯狂Thu, 09 Sep 2010 05:26:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2010/09/09/331501.htmlhttp://www.aygfsteel.com/freeman1984/comments/331501.htmlhttp://www.aygfsteel.com/freeman1984/archive/2010/09/09/331501.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/331501.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/331501.html
一、cookie机制和session机制的区?br /> ***********************************************************************
具体来说cookie机制采用的是在客L保持状态的ҎQ而session机制采用的是在服务器端保持状态的Ҏ?br /> 同时我们也看刎ͼ׃才服务器端保持状态的Ҏ在客L也需要保存一个标识,所以session
机制可能需要借助于cookie机制来达C存标识的目的Q但实际上还有其他选择
***********************************************************************

二、会话cookie和持久cookie的区?br /> ***********************************************************************
如果不设|过期时_则表C个cookie生命周期为浏览器会话期间Q只要关闭浏览器H口Qcookie消׃。这U生命期为浏览会话期的cookie被称Z话cookie。会话cookie一般不保存在硬盘上而是保存在内存里?br />   如果讄了过期时_览器就会把cookie保存到硬盘上Q关闭后再次打开览器,q些cookie依然有效直到过讑֮的过期时间?br />   存储在硬盘上的cookie可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存的cookieQ不同的览器有不同的处理方式?br /> ***********************************************************************

三、如何利用实现自动登?br /> ***********************************************************************
  当用户在某个|站注册后,׃收到一个惟一用户ID的cookie。客户后来重新连接时Q这?br /> 用户ID会自动返回,服务器对它进行检查,定它是否ؓ注册用户且选择了自动登录,从而用户务需l出明确的用户名和密码,可以访问服务器上的资源?br /> ************************************************************************

四、如何根据用L爱好定制站点
************************************************************************
  |站可以使用cookie记录用户的意ѝ对于简单的讄Q网站可以直接将面的设|存储在cookie中完成定制。然而对于更复杂的定Ӟ|站只需仅将一个惟一的标识符发送给用户Q由服务器端的数据库存储每个标识W对应的面讄?br /> ************************************************************************

五、cookie的发?br /> ************************************************************************
1.创徏Cookie对象
2.讄最大时?br /> 3.Cookie攑օ到HTTP响应报头
如果你创Z一个cookieQƈ他发送到览器,默认情况下它是一个会话别的cookie:存储在浏览器的内存中Q用户退出浏览器之后被删除。如果你希望览器将该cookie存储在磁盘上Q则
需要用maxAgeQƈl出一个以Uؓ单位的时间。将最大时效设?则是命o览器删除该cookie?br /> 发送cookie需要用HttpServletResponse的addCookieҎQ将cookie插入C个Set-Cookie HTTPh报头中。由于这个方法ƈ不修改Q何之前指定的Set-Cookie报头Q而是创徏新的报头Q因此我们将q个ҎUCؓ是addCookieQ而非setCookie。同栯C响应报头必须在Q何文档内容发送到客户端之前设|?/p>

六、cookie的读?br /> *************************************************************************
1.调用request.getCookie
要获取有览器发送来的cookieQ需要调用HttpServletRequest的getCookiesҎQ这个调用返回Cookie对象的数l,对应由HTTPh中Cookie报头输入的倹{?br /> 2.Ҏl进行@环,调用每个cookie的getNameҎQ直到找到感兴趣的cookie为止
 cookie与你的主??相关Q而非你的servlet或JSP面。因而,管你的servlet可能只发送了单个cookieQ你也可能会得到许多不相关的cookie?br /> 例如Q?br />   String cookieName = “userID”;
    Cookie cookies[] = request.getCookies();
    if (cookies!=null){
        for(int i=0;i<cookies.length;i++){
    Cookie cookie = cookies[i];
    if (cookieName.equals(cookie.getName())){
        doSomethingWith(cookie.getValue());
}
}
}
************************************************************************

七、如何用cookie初访?br /> ************************************************************************
A.调用HttpServletRequest.getCookies()获取Cookie数组
B.在@环中索指定名字的cookie是否存在以及对应的值是否正?br /> C.如果是则退出@环ƈ讄区别标识
D.Ҏ区别标识判断用户是否为初访者从而进行不同的操作
************************************************************************

八、用cookie初访者的常见错误
************************************************************************
不能仅仅因ؓcookie数组中不存在在特定的数据就认ؓ用户是个初访者。如果cookie数组为nullQ客户可能是一个初访者,也可能是׃用户cookie删除或禁用造成的结果?br /> 但是Q如果数l非null,也不q是昄客户曄到过你的|站或域Qƈ不能说明他们曄讉Kq你的servlet。其它servlet、JSP面以及非Java Web应用都可以设|cookieQ依据\径的讄Q其中的Mcookie都有可能q回l用L览器?br /> 正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正?br /> ************************************************************************

九、用cookie属性的注意问题
************************************************************************
  属性是从服务器发送到览器的报头的一部分Q但它们不属于由览器返回给服务器的报头。 
  因此除了名称和g外,cookie属性只适用于从服务器输出到客户端的cookieQ服务器端来自于览器的cookieq没有设|这些属性。 
  因而不要期望通过request.getCookies得到的cookie中可以用这个属性。这意味着Q你不能仅仅通过讄cookie的最大时效,发出它,在随后的输入数组中查N当的cookie,d它的|修改它ƈ它存回CookieQ从而实C断改变的cookie倹{?br /> ************************************************************************

十、如何用cookie记录各个用户的访问计?br /> ************************************************************************
1.获取cookie数组中专门用于统计用戯问次数的cookie的?br /> 2.D{换成int?br /> 3.值加1q用原来的名U重新创Z个Cookie对象
4.重新讄最大时?br /> 5.新的cookie输出
************************************************************************

十一、session在不同环境下的不同含?br /> ************************************************************************
sessionQ中文经常翻译ؓ会话Q其本来的含义是指有始有l的一pd动作/消息Q比如打电话是从拿v电话拨号到挂断电话这中间的一pdq程可以UCZ个session?br /> 然而当session一词与|络协议相关联时Q它又往往隐含?#8220;面向q接”??#8220;保持状?#8221;q样两个含义?br />   session在Web开发环境下的语义又有了新的扩展Q它的含义是指一cȝ来在客户端与服务器端之间保持状态的解决Ҏ。有时候Session也用来指q种解决Ҏ的存储结构?br /> ************************************************************************

十二、session的机?br /> ************************************************************************
  session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构(也可能就是用散列表)来保存信息?br /> 但程序需要ؓ某个客户端的h创徏一个session的时候,服务器首先检查这个客L的请求里是否包含了一个session标识Q称为session id,如果已经包含一个session id则说明以前已lؓ此客户创sessionQ服务器按照session id把这个session索出来?如果索不刎ͼ可能会新Z个,q种情况可能出现在服务端已经删除了该用户对应的session对象Q但用户Zؓ地在h的URL后面附加上一个JSESSION的参??br /> 如果客户h不包含session idQ则为此客户创徏一个sessionq且生成一个与此session相关联的session idQ这个session id在本次响应中返回给客户端保存?br /> ************************************************************************

十三、保存session id的几U方?br /> ************************************************************************
AQ保存session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发送给服务器?br /> BQ由于cookie可以被h为的止Q必L其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,l常采用的一U技术叫做URL重写Q就是把session id附加在URL路径的后面,附加的方式也有两U,一U是作ؓURL路径的附加信息,另一U是作ؓ查询字符串附加在URL后面。网l在整个交互q程中始l保持状态,必d每个客户端可能请求的路径后面都包含这个session id?br /> CQ另一U技术叫做表单隐藏字Dc就是服务器会自动修改表单,d一个隐藏字D,以便在表单提交时能够把session id传递回服务器?br /> ************************************************************************

十四、session什么时候被创徏
************************************************************************
一个常见的错误是以为session在有客户端访问时p创徏Q然而事实是直到某server端程?如Servlet)调用HttpServletRequest.getSession(true)q样的语句时才会被创建?br /> ************************************************************************

十五、session何时被删?br /> ************************************************************************
session在下列情况下被删除:
AQ程序调用HttpSession.invalidate()
BQ距M一ơ收到客L发送的session id旉间隔过了session的最大有效时?br /> CQ服务器q程被停?/p>

再次注意关闭览器只会存储在客L览器内存中的session cookie失效Q不会服务器端的session对象失效?br /> ************************************************************************

十六、URL重写有什么缺?br /> ************************************************************************
   Ҏ有的URL使用URL重写Q包括超链接Qform的actionQ和重定向的URL。每个引用你的站点的URLQ以及那些返回给用户的URL(即通过间接手段Q比如服务器重定向中的Location字段)都要d额外的信息?br />    q意味着在你的站点上不能有Q何静态的HTML面(臛_静态页面中不能有Q何链接到站点动态页面的链接)。因此,每个面都必M用servlet或JSP动态生成。即使所有的面都动态生成,如果用户d了会话ƈ通过书签或链接再ơ回来,会话的信息都会丢失,因ؓ存储下来的链接含有错误的标识信息Q该URL后面的SESSION ID已经q期了。  
************************************************************************

十七、用隐藏的表单域有什么缺?br /> ************************************************************************
    仅当每个面都是有表单提交而动态生成时Q才能用这U方法。单d规的<A HREF..>文本链接ƈ不生表单提交,因此隐藏的表单域不能支持通常的会话跟t,只能用于一pd特定的操作中Q比如在U商店的l̎q程
************************************************************************

十八、会话跟t的基本步骤
************************************************************************
1Q访问与当前h相关的会话对?br /> 2Q查找与会话相关的信?br /> 3Q存储会话信?br /> 4Q废弃会话数?br /> ************************************************************************

十九、getSession()/getSession(true)、getSession(false)的区?br /> ************************************************************************
getSession()/getSession(true)Q当session存在时返回该sessionQ否则新Z个sessionq返回该对象
getSession(false)Q当session存在时返回该sessionQ否则不会新建sessionQ返回null
************************************************************************

二十、如何将信息于会话关联v?br /> ************************************************************************
  setAttribute会替换Q何之前设定的|如果惌在不提供M代替的情况下U除某个|则应使用removeAttribute。这个方法会触发所有实CHttpSessionBindingListener接口的值的valueUnbound
Ҏ?br /> ************************************************************************

二十一、会话属性的cd有什么限制吗
************************************************************************
通常会话属性的cd只要是Object可以了。除了null或基本类型,如int,double,boolean?br /> 如果要用基本类型的g为属性,必须其转换为相应的装cd?br /> ************************************************************************

二十二、如何废弃会话数?br /> ************************************************************************
AQ只U除自己~写的servlet创徏的数据:
   调用removeAttribute(“key”)指定键兌的值废?br /> BQ删除整个会?在当前Web应用?Q?br />    调用invalidateQ将整个会话废弃掉。这样做会丢p用户的所有会话数据,而非仅仅由我?br /> servlet或JSP面创徏的会话数?br /> CQ将用户从系l中注销q删除所有属于他(或她)的会?br />    调用logOutQ将客户从Web服务器中注销Q同时废弃所有与该用L兌的会?每个Web应用臛_一?。这个操作有可能影响到服务器上多个不同的Web应用
************************************************************************

二十三、用isNew来判断用h否ؓ新旧用户的错误做?br /> ************************************************************************
public boolean isNew()Ҏ如果会话未和客L?览?发生M联系Q则q个Ҏq回trueQ这一般是因ؓ会话是新建的Q不是由输入的客戯求所引v的?br /> 但如果isNewq回falseQ只不过是说明他之前曄讉K该Web应用Qƈ不代表他们曾讉Kq我们的servlet或JSP面?br /> 因ؓsession是与用户相关的,在用户之前访问的每一个页面都有可能创Z会话。因此isNew为false只能说用户之前访问过该Web应用Qsession可以是当前页面创建,也可能是q户之前访问过的页面创建的?br /> 正确的做法是判断某个session中是否存在某个特定的key且其value是否正确
************************************************************************

二十四、Cookie的过期和Session的超时有什么区?br /> ************************************************************************
会话的超时由服务器来l护Q它不同于Cookie的失效日期。首先,会话一般基于驻留内存的cookie
不是持箋性的cookieQ因而也没有截x期。即使截取到JSESSIONID cookieQƈ为它讑֮一个失效日期发送出厅R浏览器会话和服务器会话也会截然不同?br /> ************************************************************************

二十五、session cookie和session对象的生命周期是一L?br /> ************************************************************************
当用户关闭了览器虽然session cookie已经消失Q但session对象仍然保存在服务器?br /> ************************************************************************

二十六、是否只要关闭浏览器Qsession消׃
************************************************************************
E序一般都是在用户做log off的时候发个指令去删除sessionQ然而浏览器从来不会d在关闭之前通知服务器它要被关闭,因此服务器根本不会有Z知道览器已l关闭。服务器会一直保留这个会话对象直到它处于非活动状态超q设定的间隔为止?br /> 之所以会有这U错误的认识Q是因ؓ大部分session机制都用会话cookie来保存session idQ而关闭浏览器后这个session id消׃Q再ơ连接到服务器时也就无法扑ֈ原来的session?br /> 如果服务器设|的cookie被保存到盘上,或者用某U手D|写浏览器发出的HTTPh报头Q把原来的session id发送到服务器,则再ơ打开览器仍然能够找到原来的session?br /> 恰恰是由于关闭浏览器不会Dsession被删除,q服务器ؓsession讄了一个失效时_当距d户上一ơ用session的时间超q了q个失效旉Ӟ服务器就可以认ؓ客户端已l停止了zdQ才会把session删除以节省存储空间?br />   由此我们可以得出如下l论Q?br />   关闭览器,只会是浏览器端内存里的session cookie消失Q但不会使保存在服务器端的session对象消失Q同样也不会使已l保存到盘上的持久化cookie消失?br /> ************************************************************************


二十七、打开两个览器窗口访问应用程序会使用同一个sessionq是不同的session
************************************************************************
通常session cookie是不能跨H口使用的,当你新开了一个浏览器H口q入相同面Ӟpȝ会赋予你一个新的session idQ这h们信息共享的目的p不到了?br /> 此时我们可以先把session id保存在persistent cookie?通过讄session的最大有效时?Q然后在新窗口中d来,可以得C一个窗口的session id了,q样通过session cookie和persistent cookie的结合我们就可以实现了跨H口的会话跟t?br /> ************************************************************************

二十八、如何用会话显C每个客L讉Kơ数
************************************************************************
׃客户的访问次数是一个整型的变量Q但session的属性类型中不能使用intQdoubleQboolean{基本类型的变量Q所以我们要用到q些基本cd的封装类型对象作为session对象中属性的?br />   但像Integer是一U不可修?Immutable)的数据结构:构徏后就不能更改。这意味着每个h都必d建新的Integer对象Q之后用setAttribute来代替之前存在的老的属性的倹{例如:
HttpSession session = request.getSession();
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
if (value= =null){
    value = new SomeImmutableClass(…); // 新创Z个不可更改对?br /> }else{
    value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对?br /> }
session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象
************************************************************************

二十九、如何用会话篏计用L数据
************************************************************************
使用可变的数据结构,比如数组、List、Map或含有可写字D늚应用E序专有的数据结构。通过q种方式Q除非首ơ分配对象,否则不需要调用setAttribute。例?/p>

HttpSession session = request.getSession();
SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
if(value = = null){
    value = new SomeMutableClass(…);
    session.setAttribute(“someIdentifier”,value);
}else{
    value.updateInternalAttribute(…);     // 如果已经存在该对象则更新其属性而不需重新讄属?br /> }
************************************************************************

三十、不可更改对象和可更改对象在会话数据更新时的不同处理
************************************************************************
不可更改对象因ؓ一旦创Z后就不能更改Q所以每ơ要修改会话中属性的值的时候,都需?br /> 调用setAttribute(“someIdentifier”,newValue)来代替原有的属性的|否则属性的g会被更新
可更改对象因为其自n一般提供了修改自n属性的ҎQ所以每ơ要修改会话中属性的值的?br /> 候,只要调用该可更改对象的相关修改自w属性的Ҏ可以了。这意味着我们׃需要调
用setAttributeҎ?/p>

************************************************************************
2.cookies的属性有QDomain(?Q哪个站点发的哪个站Ҏ?br />                    Expires:是否q期
                   Haskeys:是否包含关键
                   path:存放的\?br />                    secure:是否安全
注:Q-Qcookies的设|在 sever端设|,路径与域一h成cookie的作用范?
q个是什么意思的啊?Z么会是在服务器端q行讄的呢Q?br />     若不讄q期旉Q则表示q个cookie的生命期为浏览器会话期间Q关闭浏览器H口Qcookie消失。这U生命期为浏览器会话期的cookie被称Z话cookie。会话cookie一般不存储在硬盘上而是保存在内存里Q当然这U行为ƈ不是规范规定的。若讄了过期时_览器就会把cookie 保存到硬盘上Q关闭后再次打开览器,q些cookie仍然有效直到过讑֮的过期时间。存储在盘上的cookie可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存里的cookieQ不同的览器有不同的处理方?br /> IE与FF的区别哦QFF是共享的而IE当打开不同的窗口的时候是不共??br /> 3.session(会话)Q适用于同一客户在一个站点,不同面上的览Q适用于同一客户在一个页面上Q不断的h?br /> 6.当程序需要ؓ某个客户端的h创徏一个sessionӞ服务器首先检查这个客L的请求里是否已包含了一个session标识Q称为session idQ,如果已包含则说明以前已经为此客户端创sessionQ服务器按照session id把这个session索出来用(索不刎ͼ会新Z个)Q如果客Lh不包含session idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session idQsession id的值应该是一个既不会重复Q又不容易被扑ֈ规律以仿造的字符Ԍq个session id被在本ơ响应中q回l客L保存?/p>

IE?
有效的窗中包?
1.Session对象只在建立Session对象的窗口中有效?
2.在徏立Session对象的窗口中新开链接的窗?
无效的窗口包?
1.直接启动IE览器的H口
2.不是在徏立Session对象的窗口中新开链接的窗?

***********************************************************************
cookie的内容主要包括:名字Q|q期旉Q\径和域?br /> 其中,

    域可以指定某一个域比如.google.comQ相当于d招牌Q比如宝z公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.comQ可以用飘柔来做比?br /> 路径是跟在域名后面的URL路径Q比?或?foo{等Q可以用某飘柔专柜做比?br />    路径与域合在一起就构成了cookie的作用范围?br /> 如果不设|过期时_则表C个cookie的生命期为浏览器会话期间Q只要关闭浏览器H口Qcookie消׃。这U生命期为浏览器会话期的 cookie被称Z话cookie。会话cookie一般不存储在硬盘上而是保存在内存里Q当然这U行为ƈ不是规范规定的。如果设|了q期旉Q浏览器׃把cookie保存到硬盘上Q关闭后再次打开览器,q些cookie仍然有效直到过讑֮的过期时间?/p>

   存储在硬盘上的cookie可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存里的cookieQ不同的览器有不同的处理方式。对于IEQ在一个打开的窗口上按Ctrl-NQ或者从文g菜单Q打开的窗口可以与原窗口共享,而用其他方式新开的IEq程则不能共享已l打开的窗口的内存cookieQ对于Mozilla Firefox0.8Q所有的q程和标{N都可以共享同Lcookie。一般来说是用javascript的window.open打开的窗口会与原H口׃n内存cookie。浏览器对于会话cookie的这U只认cookie不认人的处理方式l常l采用session机制的web应用E序开发者造成很大的困扰?/p>

[l典的语录]

下面是一个goolge讄cookie的响应头的例?br /> HTTP/1.1 302 Found
Location: http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html

到时候我们的域就要设|ؓdomain=.*****.cn path=/

session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构Q也可能是使用散列表)来保存信息?/p>

四、理解session机制
session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构Q也可能是使用散列表)来保存信息?/p>

当程序需要ؓ某个客户端的h创徏一个session的时候,服务器首先检查这个客L的请求里是否已包含了一个session标识 - UCؓsession idQ如果已包含一个session id则说明以前已lؓ此客L创徏qsessionQ服务器按照session id把这个session索出来用(如果索不刎ͼ可能会新Z个)Q如果客Lh不包含session idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session idQsession id的值应该是一个既不会重复Q又不容易被扑ֈ规律以仿造的字符Ԍq个session id被在本ơ响应中q回l客L保存?/p>

保存q个session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发挥l服务器。一般这个cookie的名字都是类g SEEESIONIDQ而。比如weblogic对于web应用E序生成?cookieQJSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764Q它的名字就是JSESSIONID?/p>

׃cookie可以被h为的止Q必L其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一U技术叫做URL重写Q就是把session id直接附加在URL路径的后面,附加方式也有两种Q一U是作ؓURL路径的附加信息,表现形式为http://..... /xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一U是作ؓ查询字符串附加在URL后面Q表现Ş式ؓhttp://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
q两U方式对于用h说是没有区别的,只是服务器在解析的时候处理的方式不同Q采用第一U方式也有利于把session id的信息和正常E序参数区分开来?br /> Z在整个交互过E中始终保持状态,必d每个客户端可能请求的路径后面都包含这个session id?/p>

另一U技术叫做表单隐藏字Dc就是服务器会自动修改表单,d一个隐藏字D,以便在表单提交时能够把session id传递回服务器。比如下面的表单
<form name="testform" action="/xxx">
<input type="text">
</form>
在被传递给客户端之前将被改写成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
q种技术现在已较少应用Q笔者接触过的很古老的iPlanet6(SunONE应用服务器的前n)׃用了q种技术?br /> 实际上这U技术可以简单的用对action应用URL重写来代ѝ?/p>

在谈论session机制的时候,常常听到q样一U误?#8220;只要关闭览器,session消׃”。其实可以想象一下会员卡的例子,除非֮d对店家提出销卡,否则店家l对不会L删除֮的资料。对session来说也是一LQ除非程序通知服务器删除一个sessionQ否则服务器会一直保留,E序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会d在关闭之前通知服务器它要关闭Q因此服务器Ҏ不会有机会知道浏览器已经关闭Q之所以会有这U错觉,是大部分session机制都用会话cookie来保存session idQ而关闭浏览器后这个session id消׃Q再ơ连接服务器时也无法找到原来的session。如果服务器讄的cookie被保存到盘上,或者用某U手D|写浏览器发出?HTTPh_把原来的session id发送给服务器,则再ơ打开览器仍然能够找到原来的session?/p>

恰恰是由于关闭浏览器不会Dsession被删除,q服务器ؓseesion讄了一个失效时_当距dL上一ơ用session的时间超q这个失效时间时Q服务器可以认为客L已经停止了活动,才会把session删除以节省存储空间?/p>

[写得太精彩了。感受太׃Q]

1、session在何时被创徏
一个常见的误解是以为session在有客户端访问时p创徏Q然而事实是直到某server端程序调?HttpServletRequest.getSession(true)q样的语句时才被创徏Q注意如果JSP没有昄的?<%@page session="false"%> 关闭sessionQ则JSP文g在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);q也是JSP中隐含的session对象的来历?

׃session会消耗内存资源,因此Q如果不打算使用sessionQ应该在所有的JSP中关闭它?/p>

2、session何时被删?br /> l合前面的讨论,session在下列情况下被删除a.E序调用HttpSession.invalidate();或b.距离上一ơ收到客L发送的session id旉间隔过了session的超时设|?或c.服务器进E被停止Q非持久sessionQ?/p>

3、如何做到在览器关闭时删除session
严格的讲Q做不到q一炏V可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进E这些非常规手段仍然无能为力?/p>

7、开两个览器窗口访问应用程序会使用同一个sessionq是不同的session
参见W三节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器Q不同的H口打开方式以及不同的cookie存储方式都会对这个问题的{案有媄响?/p>

8、如何防止用h开两个览器窗口操作导致的session混ؕ
q个问题与防止表单多ơ提交是cM的,可以通过讄客户端的令牌来解冟뀂就是在服务器每ơ生成一个不同的idq回l客LQ同时保存在session里,客户端提交表单时必须把这个id也返回服务器Q程序首先比较返回的id与保存在 session里的值是否一_如果不一致则说明本次操作已经被提交过了。E对不起你已经投过了Q可以这hq行控制的哦Q?/p>

八、ȝ
session机制本nq不复杂Q然而其实现和配|上的灵zL却使得具体情况复杂多变。这也要求我们不能把仅仅某一ơ的l验或者某一个浏览器Q服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析?/p>


文章出处QDIY部落(http://www.diybl.com/course/3_program/java/javashl/20090306/158662.html)

************************************************************************

关于COOKIE和SESSION的关p,一直没搞清楚。网上一搜COOKIEQ普遍都有会话COOKIE和持久COOKIE的概c?

rubyeye的博客里有这L解释Q我把部分脓q来。(http://rubyeye.javaeye.com/blog/196117Q?


引用
当你W一ơ访问一个网站的时?|站服务器会在响应头内加?br /> Set-Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务?,或Set-Cookie JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服务?信息,此信息是服务器随机生成的,攑֜服务器内存里,Z标识唯一的客L用户,内容不会重复,q就是sessionid.
   当浏览器得到q个sessionid会将它放在自qq程内存?q里不同的浏览器会有所不同,IEq程间不能共享这个sessionid,也就是新开一个IE不能共享这个sessionid;而Firefoxq程间可以共?然后你l发hl这个网站的时?览器就会把q个sessionid攑֜h头里发送给该服务器?q样服务器得到sessionid后再和自己内存里存放的sessionidҎ锁定客户?从而区分不同客L,完成会话.
   可以看出如果用这U方?当用户在会话的过E中关闭览器结束进E?则这个sessionid消?如果用户又打开览器想l箋q次会话的时?׃因ؓ发送的h中没有这个sessionid而服务器无法L别该把那个session信息l他,注意(q个时候服务器端的sessionid和sessionid所指向的session都还存在,只是没有正确的sessionid和它匚w而占用服务器内存,只有sessionq期或服务器重启才释攑ֆ?.
   上面q种方式叫会话cookie,把cookie攑֜览器内存里,只能在这个浏览器的内存范围里完成会话,是一U不长久的方?Z能长久会?出C持久化cookie,把cookie固化在用L计算Z,现在的cookie不单单能存放sessionid,q能攄户信?样式表信息等.
   如果用户止了所有cookie的?那么会话cookie和持久化cookie都不能用?有个Ҏ也可以解决问?是URL重写,q里要说下的是URL重写只能实现会话cookie的效?持久会话实现不了.


刚开始理解时Q我也认Z有持久和会话q两UCOOKIE。我认ؓQ?
会话COOKIE是用来存放SESSIONID的,q且只存在于览器内存,览器关闭后会话COOKIEp删除Q?
持久COOKIE是用来存放其它信息Qƈ且是在我们的本地盘里能看到的那UCOOKIE?

然后我写了个SERVLET试了一下?

Java代码
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {   
       
    Cookie cookie = null;   
       
    PrintWriter out = response.getWriter();   
    out.println("<html><body>");   
       
    Cookie[] cookies = request.getCookies();   
       
    // 如果没有COOKIEQ新Z个COOKIE   
    if (cookies == null) {   
           
        out.println("<b>cookies is null.</b></br>");   
           
        cookie = new Cookie("new", "1");   
           
        response.addCookie(cookie);   
           
    } else {   
           
        out.println("<b>cookies is not null.</b></br>");   
           
        for (int i = 0; i < cookies.length; i++) {   
               
            cookie = cookies[i];   
               
            out.println("cookie" + i + " name: " + cookie.getName() + "</br>");   
        }   
    }   
       
    HttpSession session = request.getSession();   
       
    if (session == null) {   
        out.println("<b>session is null.</b></br>");   
           
    } else {   
        out.println("<b>session is not null.</b></br>");   
        out.println("session id: " + session.getId() + "</br>");   
    }   
       
    out.println("</body></html>");   
}  
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
 
 Cookie cookie = null;
 
 PrintWriter out = response.getWriter();
 out.println("<html><body>");
 
 Cookie[] cookies = request.getCookies();
 
 // 如果没有COOKIEQ新Z个COOKIE
 if (cookies == null) {
  
  out.println("<b>cookies is null.</b></br>");
  
  cookie = new Cookie("new", "1");
  
  response.addCookie(cookie);
  
 } else {
  
  out.println("<b>cookies is not null.</b></br>");
  
  for (int i = 0; i < cookies.length; i++) {
   
   cookie = cookies[i];
   
   out.println("cookie" + i + " name: " + cookie.getName() + "</br>");
  }
 }
 
 HttpSession session = request.getSession();
 
 if (session == null) {
  out.println("<b>session is null.</b></br>");
  
 } else {
  out.println("<b>session is not null.</b></br>");
  out.println("session id: " + session.getId() + "</br>");
 }
 
 out.println("</body></html>");
}

W一ơ访问这个SERVLETQ页面显C?

引用
cookies is null.
session is not null.
session id: 0D0AABB6F911362FEE87BEEB2953C33F


W二ơ访问,面昄

引用
cookies is not null.
cookie0 name: new
cookie1 name: JSESSIONID
session is not null.
session id: 0D0AABB6F911362FEE87BEEB2953C33F


W二ơ访问时从客L来了两个COOKIEQ名?#8220;new”的COOKIE是我创徏的,名ؓ“JSESSIONID”的COOKIE应该是服务器TOMCAT创徏的,但这Ӟ在本地硬盘里找不到这两个COOKIE的文件?

改一下SERVLETQ在创徏名ؓ“new”的COOKIEӞ加一?

Java代码
cookie.setMaxAge(1000);  
cookie.setMaxAge(1000);
然后本地盘里就?#8220;new”q个COOKIE了?

q下有疑问了,在没有设|COOKIE存活期时Q自己创建的SESSION不会存到本地盘Q会不会TOMCAT创徏的所谓的会话COOKIE也是没有讄存活期呢Q?

然后Ҏzddava的博客(http://zddava.javaeye.com/blog/311053Q,扑ֈ了TOMCAT里创Z话COOKIE的代码?
?
org.apache.catalina.connector.Request.java里,

Java代码
protected void configureSessionCookie(Cookie cookie) {   
    cookie.setMaxAge(-1);   
    String contextPath = null;   
    if (!connector.getEmptySessionPath() && (getContext() != null)) {   
        contextPath = getContext().getEncodedPath();   
    }   
    if ((contextPath != null) && (contextPath.length() > 0)) {   
        cookie.setPath(contextPath);   
    } else {   
        cookie.setPath("/");   
    }   
    if (isSecure()) {   
        cookie.setSecure(true);   
    }   
}  
protected void configureSessionCookie(Cookie cookie) {
    cookie.setMaxAge(-1);
    String contextPath = null;
    if (!connector.getEmptySessionPath() && (getContext() != null)) {
        contextPath = getContext().getEncodedPath();
    }
    if ((contextPath != null) && (contextPath.length() > 0)) {
        cookie.setPath(contextPath);
    } else {
        cookie.setPath("/");
    }
    if (isSecure()) {
        cookie.setSecure(true);
    }
}
cookie.setMaxAge(-1);使COOKIE在浏览器被关闭时删除。而且q里的cookie和上面SERVLET里的cookie都是javax.servlet.http.Cookie?

由此得出l论:
    可能最开始是我理解错了,COOKIEq没有会话COOKIE和持久COOKIE之分。我们本地创建的“持久COOKIE”和WEB容器创徏?#8220;会话COOKIE”都是一UCOOKIEQ就是javax.servlet.http.Cookie。只是WEB容器把存zL讄成了关闭览器时删除而已QTOMCATQ?br />     q个l论不正。在服务器端讄q期旉后就是持久cookie了,所以有会话COOKIE和持久COOKIE之分?br /> ************************************************************************
cookie和session机制之间的区别与联系
具体来说cookie机制采用的是在客L保持状态的Ҏ。它是在用户端的会话状态的存贮机制Q他需要用h开客户端的cookie支持。cookie的作用就是ؓ了解决HTTP协议无状态的~陷所作的努力.
而session机制采用的是一U在客户端与服务器之间保持状态的解决Ҏ。同时我们也看到Q由于采用服务器端保持状态的Ҏ在客L也需要保存一个标识,所以session机制可能需要借助于cookie机制来达C存标识的目的。而session提供了方便管理全局变量的方?br /> session是针Ҏ一个用LQ变量的g存在服务器上Q用一个sessionID来区分是哪个用户session变量,q个值是通过用户的浏览器在访问的时候返回给服务器,当客L用cookieӞq个g可能讄为由get来返回给服务器?br /> 安全性来_当你讉K一个用session 的站点,同时在自己机子上建立一个cookieQ徏议在服务器端的SESSION机制更安全些.因ؓ它不会Q意读取客户存储的信息?/p>

正统的cookie分发是通过扩展HTTP协议来实现的Q服务器通过在HTTP的响应头中加上一行特D的指示以提C浏览器按照指示生成相应的cookie
从网l服务器观点看所有HTTPh都独立于先前h。就是说每一个HTTP响应完全依赖于相应请求中包含的信?br /> 状态管理机制克服了HTTP的一些限制ƈ允许|络客户端及服务器端l护h间的关系。在q种关系l持的期间叫做会?session)?br /> Cookies是服务器在本地机器上存储的小D|本ƈ随每一个请求发送至同一个服务器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范。网l服务器用HTTP头向客户端发送cookiesQ在客户l端Q浏览器解析q些cookiesq将它们保存Z个本地文Ӟ它会自动同一服务器的Mh~上q些cookies
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
理解session机制
session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构Q也可能是使用散列表)来保存信息?/p>

当程序需要ؓ某个客户端的h创徏一个session的时候,服务器首先检查这个客L的请求里是否已包含了一个session标识 - UCؓ session idQ如果已包含一个session id则说明以前已lؓ此客L创徏qsessionQ服务器按照session id把这?session索出来用(如果索不刎ͼ可能会新Z个)Q如果客Lh不包含session idQ则为此客户端创Z个sessionq且生成一个与此session相关联的session idQsession id的值应该是一个既不会重复Q又不容易被扑ֈ规律以仿造的字符Ԍq个 session id被在本ơ响应中q回l客L保存?/p>

保存q个session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发挥l服务器。一般这个cookie的名字都是类gSEEESIONIDQ而。比如weblogic对于web应用E序生成的cookieQJSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764Q它的名字就?JSESSIONID?/p>

׃cookie可以被h为的止Q必L其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一U技术叫做URL重写Q就是把session id直接附加在URL路径的后面,附加方式也有两种Q一U是作ؓURL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
另一U是作ؓ查询字符串附加在URL后面Q表现Ş式ؓhttp://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
q两U方式对于用h说是没有区别的,只是服务器在解析的时候处理的方式不同Q采用第一U方式也有利于把session id的信息和正常E序参数区分开来?br /> Z在整个交互过E中始终保持状态,必d每个客户端可能请求的路径后面都包含这个session id?/p>

另一U技术叫做表单隐藏字Dc就是服务器会自动修改表单,d一个隐藏字D,以便在表单提交时能够把session id传递回服务器。比如下面的表单
<form name="testform" action="/xxx">
<input type="text">
</form>
在被传递给客户端之前将被改写成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
q种技术现在已较少应用Q笔者接触过的很古老的iPlanet6(SunONE应用服务器的前n)׃用了q种技术?br /> 实际上这U技术可以简单的用对action应用URL重写来代ѝ?/p>

在谈论session机制的时候,常常听到q样一U误?#8220;只要关闭览器,session消׃”。其实可以想象一下会员卡的例子,除非֮d对店家提出销卡,否则店家l对不会L删除֮的资料。对session来说也是一LQ除非程序通知服务器删除一个sessionQ否则服务器会一直保留,E序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会d在关闭之前通知服务器它要关闭Q因此服务器Ҏ不会有机会知道浏览器已经关闭Q之所以会有这U错觉,是大部分session机制都用会话cookie来保存session idQ而关闭浏览器后这?session id消׃Q再ơ连接服务器时也无法找到原来的session。如果服务器讄的cookie被保存到盘上,或者用某U手D|写浏览器发出的HTTPh_把原来的session id发送给服务器,则再ơ打开览器仍然能够找到原来的session?/p>

恰恰是由于关闭浏览器不会Dsession被删除,q服务器ؓseesion讄了一个失效时_当距dL上一ơ用session的时间超q这个失效时间时Q服务器可以认为客L已经停止了活动,才会把session删除以节省存储空间?br /> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
 由JSESSIONID谈cookie与SESSION的区别和联系
在一些投之cȝ场合Q我们往往因ؓ公^的原则要求每人只能投一,在一些WEB开发中也有cM的情况,q时候我们通常会用COOKIE来实玎ͼ例如如下的代码:
< % cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
doStuffForNewbie();
//没有讉Kq?
}

else
{
doStuffForReturnVisitor(); //已经讉Kq了
}

% >

q是很浅显易懂的道理Q检COOKIE的存在,如果存在说明已经q行q写入COOKIE的代码了Q然而运行以上的代码后,无论何时l果都是执行doStuffForReturnVisitor()Q通过控制面板-Internet选项-讄-察看文g却始l看不到生成的cookie文gQ奇怪,代码明明没有问题Q不q既然有cookieQ那显C出来看看?br /> cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
out.println("Has not visited this website");
}

else
{
for (int i = 0; i < cookie.length; i++)
{
out.println("cookie name:" + cookies[i].getName() + "cookie value:" +
cookie[i].getValue());
}
}

q行l果:
cookie name:JSESSIONID cookie value:KWJHUG6JJM65HS2K6 Z么会有cookie?大家都知道,http是无状态的协议Q客hơ读取web面Ӟ服务器都打开新的会话Q而且服务器也不会自动l护客户的上下文信息Q那么要怎么才能实现|上商店中的购物车呢Qsession是一U保存上下文信息的机Ӟ它是针对每一个用LQ变量的g存在服务器端Q通过SessionID来区分不同的客户,session是以cookie或URL重写为基的,默认使用cookie来实玎ͼpȝ会创造一个名为JSESSIONID的输出cookieQ我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于览器内存中的,q不是写到硬盘上的,q也是我们刚才看到的JSESSIONIDQ我们通常情是看不到JSESSIONID的,但是当我们把览器的cookie止后,web服务器会采用URL重写的方式传递SessionidQ我们就可以在地址栏看到sessionid=KWJHUG6JJM65HS2K6之类的字W串?br /> 明白了原理,我们可以很Ҏ的分辨出persistent cookies和session cookie的区别了Q网上那些关于两者安全性的讨论也就一目了然了Qsession cookie针对某一ơ会话而言Q会话结束session cookie也就随着消失了,而persistent cookie只是存在于客L盘上的一D|本(通常是加密的Q,而且可能会遭到cookieƺ骗以及针对cookie的跨站脚本攻击,自然不如session cookie安全了?br /> 通常session cookie是不能跨H口使用的,当你新开了一个浏览器H口q入相同面Ӟpȝ会赋予你一个新的sessionidQ这h们信息共享的目的p不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新H口中读出来Q就可以得到上一个窗口SessionID了,q样通过session cookie和persistent cookie的结合我们就实现了跨H口的session trackingQ会话跟t)?br /> 在一些web开发的书中Q往往只是单的把Session和cookie作ؓ两种q列的http传送信息的方式Qsession cookies位于服务器端Qpersistent cookie位于客户端,可是session又是以cookie为基的,明白的两者之间的联系和区别,我们׃N择合适的技术来开发web service了?/p>

 

本文来自CSDN博客Qhttp://blog.csdn.net/yuhua3272004/archive/2009/07/17/4357268.aspx



疯狂 2010-09-09 13:26 发表评论
]]>
探讨JavaClassLoader与Package机制http://www.aygfsteel.com/freeman1984/archive/2010/09/01/330647.html疯狂疯狂Wed, 01 Sep 2010 15:12:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2010/09/01/330647.htmlhttp://www.aygfsteel.com/freeman1984/comments/330647.htmlhttp://www.aygfsteel.com/freeman1984/archive/2010/09/01/330647.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/330647.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/330647.html

Z深入了解Java的ClassLoader机制Q我们先来做以下实验Q?/p>

package java.lang;
public class Test {
    public static void main(String[] args) {
        char[] c = "1234567890".toCharArray();
        String s = new String(0, 10, c);
    }
}

StringcL一个Package权限的构造函数String(int offset, int length, char[] array)Q按照默认的讉K权限Q由于Test属于java.lang包,因此理论上应该可以访问String的这个构造函数。编译通过Q执行时l果如下Q?/p>

Exception in thread "main" java.lang.SecurityException: Prohibited package name:
 java.lang
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

奇怪吧Q要弄清Z么会有SecurityExceptionQ就必须搞清楚ClassLoader的机制?/p>

Java的ClassLoader是用来动态装载class的,ClassLoader对一个class只会装蝲一ơ,JVM使用的ClassLoader一共有4U:

启动c装载器Q标准扩展类装蝲器,c\径装载器和网l类装蝲器?/p>

q?UClassLoader的优先依次从高CQ用所谓的“双亲委派模型”?切地说Q如果一个网l类装蝲器被h装蝲一个java.lang.IntegerQ它会首先把h发送给上一U的c\径装载器Q如果返回已装蝲Q则|络 c装载器不会装载这个java.lang.IntegerQ如果上一U的c\径装载器q回未装载,它才会装载java.lang.Integer?/p>

c?似的Q类路径装蝲器收到请求后Q无论是直接h装蝲q是下一U的ClassLoader上传的请求)Q它也会先把h发送到上一U的标准扩展c装载器Q这 样一层一层上传,于是启动c装载器优先U最高,如果它按照自q方式扑ֈ了java.lang.IntegerQ则下面的ClassLoader 都不能再装蝲java.lang.IntegerQ尽你自己写了一个java.lang.IntegerQ试囑֏代核心库?java.lang.Integer是不可能的,因ؓ自己写的q个cL本无法被下层的ClassLoader装蝲?/p>

再说说Package权限。Java语言规定Q在同一个包中的classQ如果没有修饰符Q默认ؓPackage权限Q包内的class都可以访问。但是这q不够准。确切的_只有由同一个ClassLoader装蝲的class才具有以上的Package权限。比如启动类装蝲器装载了java.lang.StringQ类路径装蝲器装载了我们自己写的java.lang.TestQ它们不能互相访问对方具有Package权限的方法。这样就L了恶意代码访问核心类的Package权限Ҏ?/p>

 

 



疯狂 2010-09-01 23:12 发表评论
]]>
md5加盐验证用户密码的小例子http://www.aygfsteel.com/freeman1984/archive/2010/02/09/312406.html疯狂疯狂Tue, 09 Feb 2010 05:13:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2010/02/09/312406.htmlhttp://www.aygfsteel.com/freeman1984/comments/312406.htmlhttp://www.aygfsteel.com/freeman1984/archive/2010/02/09/312406.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/312406.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/312406.htmlpackage com.test;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.Arrays;

//使用md5和盐验证安全登陆
public class Test_MD5 {

 private static final String PWD_FILE = "c:\\pwd.txt";
 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  
       
  //用户创徏密码Q服务端杂凑q保?br />   saveMessagePwdInFile("admin");
  ////验证用户输入
  checkUserPwd("admin1");
    
  
 }
 public static void saveMessagePwdInFile(String inputPwd)throws Exception{
  byte[] salt = new byte[8];
  SecureRandom random = new SecureRandom();
  random.nextBytes(salt);
  System.out.println("生成的盐Q?+Arrays.toString(salt));
  
  MessageDigest digest = MessageDigest.getInstance("MD5");//当然可以使用SHAQ?60位)QMD5(128?
  digest.update(salt);
  digest.update(inputPwd.getBytes("utf-8"));
  byte[] afterMd5 = digest.digest();
  System.out.println("杂凑|"+Arrays.toString(afterMd5));
  
  //盐和杂凑值写入文?br />   FileOutputStream outputStream = new FileOutputStream(new File(PWD_FILE));
  FileChannel channel = outputStream.getChannel();
  channel.write(ByteBuffer.wrap(salt));
  channel.write(ByteBuffer.wrap(afterMd5));
  outputStream.flush();
  outputStream.close();
  System.out.println("保存信息完毕...");
  
 }
 public static void checkUserPwd(String pwd)throws Exception{
  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  FileInputStream fileInputStream = new FileInputStream(new File(PWD_FILE));
  FileChannel channel2 = fileInputStream.getChannel();
  ByteBuffer dst = ByteBuffer.allocate(1024);
  int l = -1;
  while((l=channel2.read(dst))!=-1){
   dst.flip();
   byteArrayOutputStream.write(dst.array(),0,l);
   dst.compact();
   dst.clear();
  }
  fileInputStream.close();
  byte[] pwdbyte = byteArrayOutputStream.toByteArray();
  byteArrayOutputStream.reset();
  
  byte[] salt2 = new byte[8];
  System.arraycopy(pwdbyte, 0, salt2, 0, 8);
  System.out.println("从文件获取盐Q?+Arrays.toString(salt2));
  byte[] pwdinfile = new byte[pwdbyte.length-8];
  System.arraycopy(pwdbyte, 8, pwdinfile, 0, pwdbyte.length-8);
  System.out.println("从文件获取杂凑|"+Arrays.toString(pwdinfile));
     byte[] toyz = getUserMd5Pwd(salt2,pwd);
     System.out.println(Arrays.equals(toyz, pwdinfile)==true?"登陆成功":"密码有误Q登录失?..");
 }
 
   public static byte[] getUserMd5Pwd(byte[] salt,String pwd) throws Exception{
    MessageDigest digest2 = MessageDigest.getInstance("MD5");
  digest2.update(salt);
     digest2.update(pwd.getBytes("utf-8"));
     byte[] toyz = digest2.digest();
    
     System.out.println("用户输入杂凑|"+Arrays.toString(toyz));
     return toyz;
   }
}



疯狂 2010-02-09 13:13 发表评论
]]>
վ֩ģ壺 | żҽ| С| | ʲ| | | ̩| ɽ| | | Ӽ| | Ͳ| | ľ| | Ԫ| ؼ| | ʡ| | | ӡ| | ȳ| | | | Ĭ| | ͭɽ| | ҵ| ľ| | Ԫ| | | | ͡|