关于cookie禁用后sessionid传值的一个问题?请各位进了看下吧!

最近在做wap项目维护,当cookie禁用后sessionid传值改怎么办?
我自己做的是由response.encodeURL()的方法来做,不过整个项目的href链接没有几千都好几百。
我不可能每个href链接都加个response.encodeURL()吧?
请问各位大侠有什么好的解决办法没?

Java Servlet API 中引用 Session 机制来追踪客户的状态。Servlet API 中定义了 javax.servlet.http.HttpSession 接口,Servlet 容器必须实现这个接口。当一个 Session 开始时,Servlet 容器将创建一个 HttpSession 对象,Servlet 容器为 HttpSession 分配一个唯一标识符,称为 Session ID。Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取 Session ID,然后根据 Session ID 找到相应的 HttpSession 对象,从而获取客户的状态信息。 
当客户端浏览器中禁止 Cookie,Servlet 容器无法从客户端浏览器中取得作为 Cookie 的 Session ID,也就无法跟踪客户状态。 
Java Servlet API 中提出了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,把 Session ID 添加到 URL 信息中。 
HttpServletResponse 接口提供了重写 URL 的方法:public java.lang.String encodeURL(java.lang.String url) 

该方法的实现机制为:
● 先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。
● 再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。
我们可以对网页中的链接稍作修改,解决以上问题:
修改前:

修改后:
“>

Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

是不是Cookie让禁用了,Session就一定不能用了呢?

保存session id的几种方式:

  A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。

  B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

  C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。

使用隐藏的表单域有什么缺点:

  仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中

重写PrintWriter,效率如何就不敢保证了。

URL重写有什么缺点:

  对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。

  这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。

似乎这是目前最好的解决方案

貌似没想到有什么好方法。不知你是用什么方法把这些URL填到页面里的,如果生成这些URL是集中在统一的方法里还好,如果是分散的话,估计就比较杯具了

只是比较麻烦,一两天应该是能做完的,只是需要不断的Ctrl+C、Ctrl+V,还要仔细,不要弄错

可以看看各页面的链接方式有没有什么可以共用、提取的东西,提高复用性、减化工作

http response的content-type header里指定的编码和html meta标签指定的编码是有优先级的。

[quote]To sum up, conforming user agents must observe the following priorities when

determining a document's character encoding (from highest priority to lowest):

An HTTP "charset" parameter in a "Content-Type" field.
A META declaration with "http-equiv" set to "Content-Type" and a value set for "charset".
The charset attribute set on an element that designates an external resource.[/quote]

抓了一下http://yymovie.cn/page2.html的包,服务器返回的响应头是这样的
Content-Type text/html; charset=utf-8
所以浏览器是以utf-8编码来解析页面内容的,这个可以在浏览器的 查看->字符编码 里看出。
楼主不妨以上面的优先级来处理编码问题。
具体可以参考文档:
http://www.w3.org/TR/html4/charset.html#doc-char-set

不好意思,网络一卡,回错帖子鸟。。。 :oops:

这个说的好像很有道理。建议大家看到最后。

asp.net chrome浏览器无法使用session的原因和解决办法 - 项目实战 - IT工作生活这点事。Just Such So!
http://www.suchso.com/projecteactual/aspnet-chrome-cookie-session-id.html

这个说的好像很有道理。建议大家看到最后。

asp.net chrome浏览器无法使用session的原因和解决办法 - 项目实战 - IT工作生活这点事。Just Such So!
http://www.suchso.com/projecteactual/aspnet-chrome-cookie-session-id.html

这个说的好像很有道理。建议大家看到最后。

asp.net chrome浏览器无法使用session的原因和解决办法

http://www.suchso.com/projecteactual/aspnet-chrome-cookie-session-id.html