response.encodeURL的用法 把 Session ID 添加到 URL 信息中

来源:互联网 发布:http5网络协议 编辑:程序博客网 时间:2024/06/06 13:03


当一个 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。 
    我们可以对网页中的链接稍作修改,解决以上问题: 
    修改前: 

 <a href=“maillogin.jsp“> 
   修改后: 
        <a href=“<%=response.encodeURL(“maillogin.jsp“)%>“> 
一道华为的面试(笔试)题目,如下,希望能帮助大家更好的理解这一点!

Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?

(译:那个方法是servlet用于将其session ID入在一个URL中,该URL写入servlet的响应输出流)

A. The encodeURL method of the HttpServletRequest interface.

B. The encodeURL method of the HttpServletResponse interface.

C. The rewriteURL method of the HttpServletRequest interface.

D. The rewriteURL method of the HttpServletResponse interface.

例子:

  1. <%@ page session="true" contentType="text/html; charset=gbk" %>  
  2. <!--session="true" 默认是true 一般不用写,如果设为false,seesion对象不可使用-->
  3. <html> 
  4. <body> 
  5. <%  
  6. Integer num = new Integer(100);  
  7. session.putValue("num",num);  
  8. String url =response.encodeURL("sessionURL.jsp");  
  9. %>  
  10. <!-- <a href="<%=url%>">里面单引号 双引号 均可  --> 
  11. <a href='<%=url%>'>sessionURL.jsp</a>  
  12. </body> 
  13. </html> 

sessionURL.jsp:

  1. <html> 
  2. <body> 
  3. <%@ page session="true" %>  
  4. <%  
  5. Integer i= (Integer)session.getValue("num");  
  6. out.println("Num value in session is "+i.intValue());  
  7. %>  
  8. </body> 
  9. </html> 

请求时 附加了session id:

http://localhost:8080/WebTest/sessionURL.jsp;

jsessionid=0077CEA8C6E29C1DCB456B09D6F511FE

 

public interface HttpSession

Provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user.

The servlet container uses this interface to create a session between an HTTP client and an HTTP server. The session persists for a specified time period, across more than one connection or page request from the user. A session usually corresponds to one user, who may visit a site many times. The server can maintain a session in many ways such as using cookies or rewriting URLs.

This interface allows servlets to

  • View and manipulate information about a session, such as the session identifier, creation time, and last accessed time
  • 查看并处理有关会话的信息,如会话标识符,创建时间,上次访问时间
  • Bind objects to sessions, allowing user information to
    persist across multiple user connections
  • 将对象绑定到会话,允许用户信息,坚持在多个用户连接

session的实现原理 

Session的实现方式有两种,一个是通过cookie,另一个是通过url重写。
1. 通过cookie
Cookie是保存在客户端的一小段信息,服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端。
在MyEclipse环境下新建一个Web Project,命名为Test,在WebRoot下新建一个名为cookie的jsp页面,代码如下:

Java代码 


<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<title>session实现原理</title>
</head>
<body>
<%
Cookie [] c = request.getCookies();
if(c==null){
out.println(“sorry,cookie is null…”);
}else{
for(int m =0;m<c.length;m++){
out.println(c .getName()+” “+c .getValue()+”<br>”);
}
}
%>
</body>
</html>

打开浏览器,在地址栏中输入http://localhost:8080/Test/cookie.jsp,会输出”sorry,cookie is null…”,表明在此次请求信息中没有cookie信息,但在这一过程中,服务器会自动生成一个session(因为session是jsp中的内置对象,如果在servlet中必须显示请求session,才会生成,即HttpSession session = request.getSession();)用以表示此次“会话”,同时将与该session相对应的sessionID以cookie的方式发送给客户端。当客户端再次请求该页面(应用程序)时,会自动将此cookie通过请求信息带到服务器端。因此,当你刷新上一次的请求时,页面会输出一个名为JSESSIONID的cookie,后面就是相应的cookie值,也就是本次“会话”的sessionID,
,当你再次刷新此页面时会得到相同的输出,因为在一次“会话”中,请求信息携带的sessionID与上一次响应的sessionID相一致。存放在客户端的用于保存sessionID的cookie会在浏览器关闭时清除,因此当你重新打开一个浏览器时,第一次的输出依然会是”sorry,cookie is null…”因为服务器认为这是一次新的“会话”,同样当你刷新此页面时,页面会输出一个名为JSESSIONID的cookie,但注意此时后面的cookie值与上一次肯定不相同,因为这是一次新的“会话”。

2. url重写
通过cookie可以很好地实现session,但是如果客户端由于某些原因(比如出于安全考虑)而禁用cookie,在这种情况之下,为了使session能够继续生效,可以采用url重写。url重写很简单,比如我要从1.jsp页面跳转到2.jsp,采用超链接的方式,可以用两种方式:一种如下所示:
<a href=”2.jsp”>2.jsp</a>
另一种是<a href=”<%=response.encodeURL(“2.jsp”)%>”>2.jsp</a>
其中第二种方式就是采用了url重写,在cookie没有被禁用的情况下,它与第一种情况没有什么区别,但在cookie禁用是,它会将SessionID的信息作为请求地址的一部分传到了服务器端,这就是URL重写的意义所在。

 

Session的原理就是 
1,首次访问时,服务器开辟一块内存,并且把这块内存生成一个唯一标识送给客户端。 
2,浏览器保存这个唯一标识(其实就是HTTP头部的sessionID) 
3,再次请求时,浏览器检查唯一标识,如果有就送到服务器端。 
4,服务器端根据这个标识,就可以使用刚才保存再内存中的变量值了。 

采用这种方式可以减少大量的数据在网络上传送,同时使得无状态的http协议变得有状态了。 

由于sessionID需要保留在客户端,并且在网络间传输,所以在某些情况下,客户端禁止了cookie,就会出现无法获得session得情况,因为每次请求都没有返回那个唯一标识了。 
这样就采用了url重写得机制来实现session。其实就是把唯一标识写在url后面,例如: 
http://www.some.com/getbook.jsp?sessionid=A3481198BCD888939287DADFCE7A 
这样得url。这种实现方式比较麻烦,因为所有得url都要加一个这种东西。但是好处是即使客户端禁止了cookie也可以保持session。

     TTP协议是无状态的,即信息无法通过HTTP协议本身进传递。为了跟踪用户的操作状态,ASP应用SESSION对象。JSP使用一个叫HttpSession的对象实现同样的功能。HTTPSession 是一个建立在cookies 和URL-rewriting上的高质量的界面。Session的信息保存在服务器端,Session的id保存在客户机的cookie中。事实上,在许多服务器上,如果浏览器支持的话它们就使用cookies,但是如果不支持或废除了的话就自动转化为URL-rewriting,session自动为每个流程提供了方便地存储信息的方法。    Session一般在服务器上设置了一个30分钟的过期时间,当客户停止活动后自动失效。Session 中保存和检索的信息不能是基本数据类型如 int, double等,而必须是java的相应的对象,如Integer, Double.