javaWEB开发会话与状态管理

问题:http协议是一种状态协议,WEB服务器本身不能识别出哪些请求时同一个浏览器出的,浏览器的每请求

都是完全孤立的。

所以:作为WEB服务器,必须能够采用一种机制来唯一的标识一个用户,同时记录 该用户的状态。

概念:

  • 会话:客户端浏览器与web服务器之间连续发生的一系列请求和响应的过程
  • 会话状态:客户端浏览器与web服务器会话过程中产生的状态信息。借助于会话状态,web服务器可以把属于同一会话请求和响应给关联起来

要实现有状态的会话,需要浏览器对发出的每一个请求进行标识,属于同一个会话中请求都带有相同的标识,这个标识称之为会话IDSessionID)。在servlet规范中,常用Cookie和Session来完成会话跟踪。

Cookie

cookie机制采用的是在浏览器中保存http状态信息的方案Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在http响应消息头中附带传给浏览器的一个小文本文件,浏览器保存了这个Cookie,那么它在以后每次访问该WEB服务器时,都会在http请求头中将这个Cookie回传给WEB服务器

  • 示例代码:

Cookie[] cookies = request.getCookies();
     if (cookies != null && cookies.length > 1) {
         for (Cookie c : cookies) {
             out.print(c.getName() + ":" + c.getValue());
             out.print("<br>");
         }
     }
     else {
         out.print("还没cookie!正在创建");
         //1.创建一个Cookie对象
         Cookie cookie = new Cookie("name", "white_pig");
         //2.调用response的一个方法把Cookie传给客户端
         response.addCookie(cookie);
     }

cookie的相关api

  • Cookie一旦创建,名称便不可更改
  •  get/setMaxAge:该Cookie失效的时间,单位秒。如果为正数,则该Cookie在>maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1。
  • get/setSecure:该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络>上传输数据之前先将数据加密。默认为false。
  •  get/setPath:该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。
  •  get/setDomain:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。

Cookie注意事项

  • Cookie具有不可跨域名性。
  • 根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。
  • Cookie并不提供修改、删除操作。
  • 如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。

session 

Session机制是服务器端记录http状态信息。

Session的生命周期

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

Session的有效期

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。

Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。

Session的常用方法

Session中包括各种方法,使用起来要比Cookie方便得多。Session的常用方法如下所示。


void setAttribute(String attribute, Object value):设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大 String getAttribute(String attribute):返回Session属性 Enumeration getAttributeNames():返回Session中存在的属性名 >void removeAttribute(String attribute):移除Session属性 String getId():返回Session的ID。该ID由服务器自动创建,不会重复 long getCreationTime():返回Session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get >CreationTime()) long getLastAccessedTime():返回Session的最后活跃时间。返回类型为long int getMaxInactiveInterval():返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效 void setMaxInactiveInterval(int second):设置Session的>超时时间。单位为秒 void putValue(String attribute, Object value):不推荐的方法。已经被setAttribute(String attribute, Object Value)替代 Object getValue(String attribute):不被推荐的方法。已经被getAttribute(String attr)替代 boolean isNew():返回该Session是否是>新创建的 void invalidate():使该Session失效

Tomcat中Session的默认超时时间为20分钟。通过setMaxInactiveInterval(int seconds)修改超时时间。可以修改web.xml改变Session的默认超时时间。例如修改为60分钟:

<session-config>

   <session-timeout>60</session-timeout>      <!-- 单位:分钟 -->

</session-config>

URL地址重写

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,例如:

<td>

    <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>">

    Homepage</a>

</td>

Cookie与Session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上;
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
  4. 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
  5. Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用(注意:有些资料说ASP解决这个问题,当浏览器的cookie被禁掉,服务端的session任然可以正常使用,ASP我没试验过,但是对于网络上很多用php和jsp编写的网站,我发现禁掉cookie,网站的session都无法正常的访问)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值