Servlet篇之会话跟踪

Servlet之会话跟踪部分
由于http协议是无状态的。所以为了能确定一个特定用户的一些事物操作就需要使用会话跟踪技术。
http协议是请求/响应的模式,即当服务器端完成客户端的请求响应后就断开链接了,http 1.1支持持续链接,但是(keep-alive时间过期)就会断开链接。
会话:服务器应该能标识出特定用户的一些列请求,组成一个单独的会话,将特定的请求与该会话链接起来。购物车和在线银行应用都是基于会话才能完成的。
java Servlet API使用session来跟踪会话和管理会话内的状态,利用session可以把一个用户的一些列请求联系在一起.
session的工作原理:当客户第一次链接到服务器的时候,服务器为其简历了一个session,并分配给用户一个sessionId,通过cookie,使用response对象发送给客户端浏览器缓存里,以后每次请求都要将该标识一起提交,服务器根据标识找出特定的session,用这个session记录用户的状态。
类似例子:去超时购买东西,管理员会给你一个盘,让你把包裹存储在里面,当你每次来时必须把盘给管理员才能取出包裹,不然任务你是新的人,会新给你分配一个盼。
在servlet中支持三种方式的会话跟踪:
1.SSL(secure Socket Layer,安全套接字层)
2.cookies
3.URL重写
SSL跟踪会话
ssl是运行在TCP/IP之上,http协议之下的加密技术。ssl是在https协议中使用的加密技术。ssl可以让采用ssl的服务器采用ssl的客户端,并在客户端与服务器端保持一种加密的链接。在加密链接的过程中会产生”会话密钥“,他说加密,解密消息的对称密钥。
cookies会话跟踪
cookie是有netscape公司发明,是服务器端发给客户端的片段信息,存储在客户端浏览器的内存中活硬盘上。
cookie是基于key和value的。服务器利用响应头Set-Cookie发送cookie信息。
cookie格式:Set-Cookie:NAME=VALUE;Comment=value;Domain=value;Max-Age=value;Path=value;Version=1;
解释:NAME是cookie的名称。comment是cookie的描述。
domain表示哪个域下面可以访问。所指定的域必须以.开头.
Path表示那个服务器路径下可以访问。
Max-Age:表示cookie的存活期,如果超过指定时间,客户端会丢弃该cookie。单位是秒。
Version是必须的。对于RFC2109应该设置的值为1.
在Servlet规范中,cookie的名称必须是JSESSIONID
实例:
Set-Cookie:cartName=wangCar;Max-Age:3600;Domain=.www.baidu.com;Path=/bbs;Version=1
表明在:www.baidu.com域名下的/bbs路径下有效。
Cookie是在响应报头和请求报头中被传递,不能与传送的内容混在一起。
如果客户端拒绝使用cookie就需要使用URL重写来跟踪会话了。
客户端请求时会:发送Cookie:name1=value1;name2=value2的全部cookie
URL重新
Url重写就是URL中嵌入表示客户的SessionID,servlet容器解释URL,取出sessionID,根据sessionID与特定的session相关联。
Session被编码为URL中路径参数,如:
http://www.baidu.com;jsessionid=2345?name=aaa&pass=bbb
,客户端在请求URL中在传递回来,这样服务器就跟踪会话了。
要跟踪会话就要将所有发往客户端的URL进行编码,可以调用HttpServletResponse的encodeURL()方法和encodeRedirectURL()方法实现,encodeRedirectURL()方法主要用于sendRedirect()方法前使用。
session的主要方法
1.Object getAttribute(String name)
2.void removeAttribute(String name)
3.void setAttribute(String name,Object obj)
4.long getCreationTime()
5.String getId()
6.long getLastAccessedTime()
7.int getMaxInactiveInternal()//返回的是毫秒,cookie返回的是秒
8.void setMaxInactiveInternal()
9.public ServletContext getServletContext()返回session所属的ServletContext对象
10.public void invalidate()//让session失效
11.public boolean isNew()

注:显示session最后访问时间返回的long可以使用new java.util.Date(longParameter)显示
在web.xml中配置的
<session-config>
     <session-timeout>5<session-timeout>//这里面的值是以分钟为单位的
</session-config>
注:response.setContentType("text/html;charset=gbk")//MIME码;字符编码
注意:开发人员个人浏览器禁用cookie后,输入localhost,会不起作用,cookie还是会生效。应该使用ip
注意:如果使用URL重写要在所有跳转处都使用encodeURL或是encodeRedirectURL.
如表单提交时都要写上response.encodeURL(url)
在servlet向客户端跳转时要用responseURL(url)
在客户端浏览器请求(包括超链接请求时)也要加上response.encodeURL()

url重写对于静态页面是无能为力的。但是可以将静态页面改成动态页面。
至于客户端是否禁用了cookie,无需自己判断,服务器会判断,如果客户端没有禁用会直接返回URL,如果禁用了会返回URL附加jsessionid
Cookie常用API
1.public Cookie(String name,String value)
2.String getComment()或是setComment(String name)
3.String getDomain()或是setDomain(String domain)
4.int getMaxAge()或是setMaxAge(int )
5.String getName()
6.String getValue()
7.String getPath()或是setPath(String path)
8.int getVersion()或是setVersion(int)
Cookie使用实例
//设置cookie
StringBuffer sb = new StringBuffer();
sb.append("username=a");
sb.append("&password=t");//t是md5加密
Cookie cookie = new Cookie("userinfo",sb.toString());
cookie.setMaxAge(60);
resp.addCookie(cookie);
resp.sendRedirect("welcome")
注意:当cookie的maxAge设置为0时表示浏览器关闭时cookie立即失效。只要设置为正值就会写到磁盘上。
//读取客户端cookie
Cookie[] cookies = req.getCookies();
if(cookies != null && cookies.length>0){
   String name = null;
   String pass = null;
   for(Cookie cookie:cookies){
      String cName = cookie.getName();
      if("userinfo".equals(cName){
           String[] array = cName.split("&");
           for(String str:array){
                String  values = str.split("=");
                if("username".equals(values[0]){
                   name = values[0];
                }
                if("password".equals(values[1]){
                   pass = values[1];
                }
                              
           }
     }
  }
}
//根据用户名和密码查询是否合法,然后做不同的跳转

猜你喜欢

转载自jameszhao1987.iteye.com/blog/1264009
今日推荐