现在的位置: 首页 > 综合 > 正文

关于servlet中session的理解

2013年08月11日 ⁄ 综合 ⁄ 共 1272字 ⁄ 字号 评论关闭

        由于Http协议是无状态的,所谓的无状态就是服务器不会记住你的客户,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。这种感觉就是你去一个饭店吃饭,你第一次去一个饭店给的是原价,你第二次去这个饭店,老板可能跟你认识了,就可能会给你优惠,可是Http是无状态的,这就好比,你去的那个饭店不管去多少次老板都不会认识你。所以我们需要一个机制用来存储用户的信息,并且能够让服务器知道。我们在饭店吃饭的时候,一般有三种方法老板会记住我们:

   

1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。

2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。

3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

   
 显然第一种方法不符合我们的HTTP协议的定义,我们只能采用第二种和第三种方法,也即对应了我们的cookie和session两种机制,一种在客户端记住此次会话,一种在服务端记住此次会话,而实际上cookie在客户端是可以给关闭的。而session在默认情况下也是通过cookie来在服务器做记录的。而实际上我们可能遇到另外一种情况就是客户端的cookie被禁用了,这时我们就要使用URL重写来作为一条后路,保证此次会话得到保持。在HttpServletResponse中要对URL进行编码,response.encodeURL("url")。服务端的程序类似如下:

    

public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
        response.setContentType("text/html");
        PrintWriter out=response.getWriter();
       //得到一个会话
        HttpSession session=request.getSession();
       
        out.println("<html><body>");
       //其中encodeURL就是向这个URL中增加额外的会话ID信息,此信息的存储会根据你容器的不同做不同的存储方式
        out.println("<a href=\"+response.encodeURL("url")+"\">click me</a>);
        out.println(</body></html>);
}

        如果想把请求重定向到另外一个URL,但是还是想使用一个会话,我们可以使用encodeRedirectURL()方法实现此种目的。

    

抱歉!评论已关闭.