JSP&Servlet 学习笔记(四)

13,使用Cookie

Cookie是在浏览器存储信息的一种方式,服务器可以响应浏览器set-cookie标头,浏览器收到这个标头与数值后,会将它以文件的形式存储

在计算机上,这个文件就称之为Cookie。

HTTP中Cookie的设定是通过set-cookie标头,所以必须在实际响应浏览器之前使用addCookie()来新增Cookie实例,在浏览器输出HTML响应之后

再运行addCookie()是没有作用的。

取得浏览器存储Cookie,可以从HttpServletRequest的getCookies()来取得,这可取得该网页所属域的所有Cookie,所以返回值是Cookie[]数组:

Cookie[] cookies=request.getCookies();

if(cookies!=null){

             for(Cookies cookie:cookies){

                              String name=cookie.getName();

                              String value=cookie.getValue();

                                ................

          }                  

}

14,HttpSession会话管理原理

HttpSession并非线程安全,所以必须注意属性设定时共享存取的问题。

实际上如何得知数个请求间的关系是由Web容器执行的,Web应用程序基于HTTP协议无状态的事实并没有改变。

尝试运行HttpServletRequest的getSession()时,Web容器会创建HttpSession对象,关键在于每个HttpSession对象都会有个特殊的ID

,称为SessionID。SessionID默认会使用Cookie存放在浏览器中,在Tomcat中,Cookie的名称时JSESSIONID,数值则是getID取得的

SessionID。

 

 由于Web容器本身是执行于JVM中的一个java程序,通过getSession()取得HttpSession,是Web容器中的一个java对象,HttpSession中存放的属性,自然

也存在于服务端web容器中。每一个HttpSession各有特殊的SessionID,当浏览器请求应用程序时,会将Cookie中存放的SessionID一并发送给应用程序,

Web容器会根据SessionID来找出对应的HttpSession对象,这样可以取得各浏览器个别的会话数据。

所以使用HttpSession进行绘画管理,设定为属性的对象存储与服务端,SessionID默认使用Cookie存放于浏览器端。Web容器存储SessionID的Cookie默认为

关闭浏览器就失效,所以重新启动浏览器请求应用程序时,通过getsession取得的是新的HttpSession对象。

默认关闭浏览器会马上失效的是浏览器上的Cookie,不是HttpSession。因为Cookie失效了,就无法通过Cookie来发送SessionID,所以尝试getSession(),容器会产生

新的HttpSession。要让HttpSession立即失效必须调用invalidate()方法,否则HttpSession会等到设定的时间过后才会被容器销毁回收。

15,HttpSession与URL重写

HttpSession默认使用Cookie存储SessionID,如果用户关掉浏览器接收Cookie的功能,就无法使用Cookie在浏览器存储SessionID。如果在

用户禁掉Cookie的情况下,仍打算运用HttpSession来进行会话管理,那么可以搭配URL重写。

使用URL重写的方式来发送SessionID,可以使用HttpServletResponse的encodeURL()协助产生所需的URL重写。

若能从HTTP请求中取得带有SessionID的Cookie,encodeURL()会将传入的URL原封不动地输出。如果容器尝试取得HttpSession实例时,无法从HTTP请求中取得带有

SessionID的Cookie时(通常为浏览器禁用Cookie的情况),encodeURL()会自动产生带有SessionID的URL重写。

如果执行encodeURL(),在浏览器第一次请求网站时,容器并不知道浏览器是否禁用Cookie,所以容器的作法是Cookie(发送set-cookie标头)与URL重写

的方式,因此若Servlet有以下语句,无论浏览器有无禁用Cookie,第一次请求时,都会现实在SessionID的URL:

request.getSession();

out.println(response.encodeURL("index.jsp"));

有一个encodeRedirectURL()方法,则可以在要求浏览器重定向时,在URL上显示SessionID。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值