关于session的实现:cookie与url重写
来源:互联网 发布:游民星空mac游戏 编辑:程序博客网 时间:2024/04/30 08:44
本文讨论的语境是java EE servlet。
我们都知道session的实现主要两种方式:cookie与url重写,而cookie是首选(默认)的方式,因为各种现代浏览器都默认开通cookie功能,但是每种浏览器也都有允许cookie失效的设置。
由于浏览器默认启动cookie功能,而且普通客户一般都不会取消cookie功能。久而久之,我们写代码的时候,也就不会在意session的具体实现,其实这里面还是有很多值得注意的地方,尤其在用户取消cookie功能的情况下。
一 servlet session实现与接口简要介绍:
servlet规范规定实现session的cookie名称强制为jsessionid(在servlet 3.0 可以自定义了),在浏览器第一次请求的时候,服务器产生一个唯一的id,并把这个id设置给一个名为jsessionid的cookie,然后再通过reponse的addcookie,输出到浏览器端。其实这些东西我们都可以通过debug模式下的去查看服务器,来验证这些内容;或者用http协议拦截器来查看,因为servlet的所有接口也都是基于http协议的,
下面基于http协议解释一下:
浏览器第一次请求:
GET /cxt/index.do HTTP/1.1
...
由于是第一次请求,所以没有cookie要推给服务器
服务器返回:
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=3EF0AEC40F2C6C30A0580844C0E6B2E8; Path=/cxt
...
<form name="form" method="post" action="/sas/Login.do;jsessionid=3EF0AEC40F2C6C30A0580844C0E6B2E8">
...
</form>
...
由于服务器没发现浏览器没提供任何cookie,服务器不知道是浏览器未提供cookie的原因:可能是cookie功能取消了,也可能是第一次访问。所以服务器生成一个名为jsessionid的cookie,用Set-Cookie来把cookie推给浏览器;并且,服务器的servlet在生成html页面的时候需要用reponse.encodeURL方法来编码url,该方法其实就是用来实现url重写功能的,这是因为浏览器可能是因为取消cookie功能,而未提供cookie的。服务器为了确保下次提交成功,必须确保生成给浏览器端的url带有jsessionid。
若cookie功能没取消,则浏览器浏览器第二次请求:
POST /cxt/login.do;jsessionid=3EF0AEC40F2C6C30A0580844C0E6B2E8 HTTP/1.1
Cookie: JSESSIONID=3EF0AEC40F2C6C30A0580844C0E6B2E8;
...
浏览器的下一次请求的时候用http的Cookie属性把当前domain的Cookie都推给服务器,来表明自己的身份。这次,服务器知道浏览器支持cookie功能,servlet不需要再使用reponse.encodeURL来编码url了
若浏览器cookie功能取消,则浏览器请求内容为
POST /cxt/login.do?jsessionid=3EF0AEC40F2C6C30A0580844C0E6B2E8 HTTP/1.1
...
服务器在接受到上述内容是,通过url后面的jsessionid参数知道这个请求与上一次请求是同一个session
与session有关的类接口:
HttpServletRequest.getSession
HttpSession
HttpServletResponse.encodeURL
二 实现url重写的编码注意点
1.既然浏览器可能被取消cookie功能,那么我们输出给客户端的代码中必须要支持url重写功能,分几种情况解释
假如纯粹用jsp/servlet来写,那么我们必须手动用reponse.encodeURL来编码每一个url,包括<a>的href,form的action,或者其他href
2.使用其它web框架的话,最好消息使用框架提供的输出href功能,否则会有匪夷所思的结果。
比如用struts,若struts单独提供了一个tag来实现html:rewrite,比如<html:rewrite action='logout'/>,在没有jsessionid cookie的情况下,最后会生成http://localhost:8080/ctx/logout.do;jsessionid=0916FB057C169069;若有jsessionid cookie,则会生成http://localhost:8080/ctx/logout.do。但是我们还注意到html:rewrite还有一个href属性,假如我们用href属性的话,则struts不会生成带有jsessionid参数。
struts中提供url重写的功能的还有html:link与html:form,比如<html:link action="logout">logout</html:link>,这个tag功能与html:rewrite相似,也有href属性,生成带有<a>标签的html内容。<html:form action="/Login"></html:form>,html:form没有href属性,只有action属性。
3.假若没有使用任何框架,则可以使用jstl提供的url重写功能
jstl提供了标签来实现c:url,比如<c:url value="logout.do" />,这个也会根据浏览器是否支持cookie,来生成带有jsessionid属性的url。
相信通过上面的总结,是我们对怎么使用session与cookie有更深入的认识。记住,在用jsp/servlet实现系统的时候,尽量不要自己写<a>标签,最好使用系统框架自带的标签来实现,否则浏览器取消cookie功能的话,系统不支持url重写功能。
- 关于session的实现:cookie与url重写
- 关于session的实现:cookie与url重写
- 关于URL重写、session,cookie
- 关于禁用cookie后,session的url重写
- Session, Cookie, Url重写与Wap
- Session,Cookie,jsessionid,Url重写
- URL重写、Cookie、Session技术
- Session,Cookie,jsessionid,Url重写
- Servlet实现禁用cookie重写URL获取session
- 关于URL重写的实现
- javaweb之Session实现简单的购物(URL重写。Cookie重写指定有效日期)和简单的验证结论
- Session,Cookie,jsessionid和Url重写
- Session,Cookie,jsessionid和Url重写
- cookie与session的实现
- URL重写实现session跟踪
- Session的底层就是Cookie原理,Cookie禁止后的URL重写
- 关于Cookie与Session
- 关于session与cookie
- C#中的out和ref
- SharePoint debug : launchPoint given is already associated with a callout
- CSDN湖大高校俱乐部活动的吐槽
- front-end development 总结
- 社交柔道术 - 《影响力》读书笔记(一)
- 关于session的实现:cookie与url重写
- sbt/sbt assembly 编译spark源码出错问题解决方法
- hdoj problem 1233 还是畅通工程(并查集+动态规划)
- 顺序栈的验证实验
- opencv中文网
- centos下正确设置DNS的方法
- 文件的编码
- HTTP协议详解
- laravel的安装与配置