`
Tristan_S
  • 浏览: 384030 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

session cookie url重写

 
阅读更多
URL重写的代码限制大,有侵入性,一般网站都不会这样做。
对于需要session的地方(登录),cookie是必须的。


-----------------

我们都知道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 可以很好地实现 Session,但是如果客户端由于某些原因(比如出于安全考虑)而禁用 Cookie,在这种情况之下,为了使 Session 能够继续生效,可以采用 URL 重写。URL 重写很简单,比如我要从 1.jsp 页面...

    session与cookie的区别和联系?

    - 如果用户的浏览器禁用了Cookie,或者某些情况无法使用Cookie,可以采用URL重写等技术来实现Session ID的传递。 - 例如,可以在URL中加入Session ID参数,或者通过隐藏表单字段等方式来传递Session ID。 3. **...

    JAVA URL重写

    - **测试URL重写的效果:** 在不同的环境下(如禁用Cookie)测试URL重写的实现效果,确保其能够正常工作。 #### 三、实验步骤详解 ##### 1. 环境搭建与工具准备 - **安装MyEclipse:** 下载并安装最新版本的...

    session与cookie.doc的区别

    4. **依赖性**:Session依赖于Cookie,如果客户端禁用Cookie,服务器可以通过URL重写技术传递SessionID,但这样会对URL产生污染,用户体验可能下降。 5. **安全性**:由于Session数据存储在服务器,相对Cookie来说...

    session和cookie详解

    如果客户端禁用了Cookie,服务器则会通过URL重写的方式将Session ID嵌入到每个URL中,例如`http://example.com/path?sessionid=uniqueId`。这种方式虽然可以实现会话跟踪,但可能会导致URL变得非常长且难以管理。 #...

    购物车的四种做法(hidden、url重写、cookie、会话)

    这里我们将探讨四种常见的实现购物车功能的技术方法:隐藏表单(hidden)、URL重写、Cookie以及会话(Session)。 1. 隐藏表单(Hidden) 隐藏表单字段是HTML表单中的一种元素,它们对用户不可见,但可以在提交表单...

    对session和cookie的一些理解

    每个用户会话在服务器上分配一个唯一的会话ID,这个ID通过Cookie或URL重写等方式发送给用户,然后用户每次请求时携带此ID,服务器根据ID找到对应会话的数据。Session在服务器端存储,因此占用资源更多,如果用户量大...

    cookie 和 session 保存的异同

    如果用户禁用了Cookie,那么Session跟踪将无法进行,除非采用URL重写等替代方法。 总结来说,Cookie和Session各有优缺点,Cookie适合存储少量、不敏感的数据,并且不需要服务器资源,而Session则适合存储更多、敏感...

    Cookie与SESSION有什么区别

    - **Session**:即使客户端禁用了Cookie,也可以通过其他方式(如URL重写)来维持Session的跟踪。 5. **生命周期**: - **Cookie**:可以通过设置过期时间来控制其生命周期。 - **Session**:通常依赖于用户的...

    session和cookie的区别

    5. 依赖性:Cookie可以独立工作,而Session通常依赖于Cookie传递Session ID,但在Cookie禁用时,可以通过URL重写或隐藏字段维持Session。 理解Cookie和Session的区别有助于开发者选择合适的方法来处理用户状态,...

    深入理解session,cookie

    服务器通过一个唯一的Session ID来标识每个用户,这个ID通常通过Cookie或URL重写等方式发送给客户端。 在Servlet中,`HttpServletRequest`对象提供了`getSession()`方法来获取或创建Session。例如,`HttpSession ...

    cookie机制和session机制的区别

    然而,如果用户禁用了Cookie,或者由于某种原因无法使用Cookie时,服务器可以采用其他方法(如URL重写)来传递Session ID,但这种方式通常不如使用Cookie高效和方便。 #### 使用场景 - **Cookie适用于**:不涉及...

    session与cookie

    此外,由于Session信息不在客户端存储,即使禁用了Cookie,只要能通过其他方式(如URL重写)传递Session ID,Session仍然可以工作。 **2. Cookie** Cookie是存储在客户端(浏览器)的一种小型数据文件,由服务器...

    JavaWeb基础-Cookie和Session的简单使用案例

    每个Session都关联一个唯一的Session ID,这个ID通过Cookie或者URL重写等方式发送到客户端。客户端每次请求时,服务器根据Session ID找到对应的Session数据,实现用户会话的维护。在JavaWeb中,我们使用HttpSession...

    Session Cookie

    - **通过URL重写传递**:这种方式是在URL中包含Session ID,即使客户端禁用了Cookie也能正常工作。 - **通过HTTP表单提交**:对于POST请求,可以通过隐藏字段将Session ID传递给服务器。 2. **安全性考虑**: - ...

    Cookie与Session机制

    2. **工作流程**:用户登录后,服务器会为该用户创建一个新的Session,分配一个唯一的Session ID,并将其通过Cookie或URL重写返回给客户端。客户端在后续请求中携带这个Session ID,服务器通过Session ID找到对应的...

    session和cookie1

    如果客户端的Cookie被禁用,服务器还可以通过URL重写或隐藏表单字段等方式传递Session ID。 Session的优点在于服务器端存储数据,安全性较高,因为数据不在客户端可见。但是,随着用户数量的增加,服务器内存的消耗...

    ASP.NET中 Session、Application、Cookie的使用

    每个Session都有一个唯一的ID,这个ID通过cookie(默认)或者URL重写等方式发送到客户端。在Session中存储的数据是私有的,不会被其他用户访问到。例如,你可以将用户的登录信息存储在Session中,以便在整个会话期间...

    **session and cookie

    5. **可用性**:如果用户禁用Cookie,Session仍然可以工作,但需要使用URL重写等方式传递Session ID;而Cookie被禁用则无法正常工作。 ### 使用场景与最佳实践 - 对于需要长期保持的状态(如用户登录状态),可以...

Global site tag (gtag.js) - Google Analytics