response.encodeURL()延伸之:URL重写

转载自:http://blog.csdn.net/shb_derek1/article/details/8025459

l 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 对象,从而获取客户的状态信息。 
    当客户端浏览器中禁止 CookieServlet 容器无法从客户端浏览器中取得作为 Cookie 的 Session ID,也就无法跟踪客户状态。 
    本质:Java Servlet API 中提出了跟踪 Session 的另一种机制,如果客户端浏览器不支持 CookieServlet容器可以重写客户请求的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。 
    我们可以对网页中的链接稍作修改,解决以上问题: 
    修改前: 
        <a href=maillogin.jsp
   修改后: 
        <a href=<%=response.encodeURL(maillogin.jsp)%> 

l 它可以在对方浏览起步支持cookies时实现会话跟踪。 这个技术叫URL重写。你可以在你的servlet、jsp中的forword()、sendRedirect()方法中放入经过该方法重写过的URL,以保证在用户浏览器关闭cookie时还能跟踪会话(实事上,我写了一个聊天室,就是用它跟踪会话)。把你的需要跟踪的会话的URL用此法重写是个很好的习惯。 
至于是否还有其他用法,很希望和大家讨论讨论。 

经典:通常,会话管理是通过服务器将Session ID作为一个cookie存储在用户的Web浏览器中来唯一标识每个用户会话。如果浏览器不支持cookies,或者将浏览器设置为不接受cookies,我们可以通过URL重写来实现会话管理。

  实质上URL重写是通过向URL连接添加参数,并把session ID作为值包含在连接中。然而,为使这生效,你需要为你的servlet 响应部分的每个连接添加 session ID 

   把 session ID 加到一个连接可以使用一对方法来简化:response.encodeURL() 使URL包含session ID,如果你需要使用重定向,可以使用 response.encodeRedirectURL() 来对URL进行编码。

  encodeURL() encodeRedirectedURL() 方法首先判断cookies是否被浏览器支持;如果支持,则参数URL被原样返回,session ID 将通过 cookies 来维持。

  来看下面的例子,两个 JSP 文件:hello1.jsphello2.jsp,及它们之间的影响。我们在hello1.jsp中简单的创建一个会话,并在session中存储一个对象实例。接着用户可以点击页面的连接到达hello2.jsp。在 hello2.jsp 中,我们从session中获取原先放置的对象并显示它的内容。注意,我们在hello1.jsp中调用了encodeURL()方法来获得hello2.jsp 的链接,使得在浏览器停用cookies的情况下,session ID自动添加到URLhello2.jsp仍能得到session对象。

  首先在启用 cookies 的情况下运行。然后关闭对cookie 的支持,重启浏览器,再运行一次。每次你都可以看到会话管理在起作用,并能在页之间传递信息。

注意,如果你想让这个例子能在关闭了cookies的浏览器中工作,你的JSP 引擎必须支持URL重写。

hello1.jsp

<%@ page session="true" %> 
<% 
Integer num = new Integer(100); 
session.putValue("num",num); 
String url =response.encodeURL("hello2.jsp"); 
%> 

<a href='<%=url%>'>hello2.jsp</a>

hello2.jsp

<%@ page session="true" %> 
<% 
Integer i= (Integer)session.getValue("num"); 
out.println("Num value in session is "+i.intValue()); 
%>

使用时,若你的浏览器支持cookie的话,要设置为不支持cookie,才会有效果,你将看到链接后的页面地址,追加了sessionID的值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值