JSP:通过url重写记录session的原理

Tomcat会为每一次浏览器会话提供一个session,如果浏览器启用了cookie,则sessionid通过cookie保存起来,浏览器会一直使用这个sessionid和tomcat交互,直到sessionid过期。但是有时候会遇到浏览器把cookie禁用了的情况,这时候可以就需要把sessionid存储在请求的URL中了,这就是一种URL重写。下面分析一下它的原理。


首先,根据 http://my.oschina.net/letiantian/blog/366964的介绍创建项目HelloJSP。

在 web/目录下创建文件index.jsp:

<%-- 
    Document   : index
    Created on : Jan 13, 2015, 11:24:35 AM
    Author     : letian
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello World!</h1>
        <%!
            int count = 0;
            synchronized void addCount() {
                count ++;
            }
        %>
        <%
            addCount();
            session.setAttribute("name", "letian");
        %>
        
        <h1>第<%=count %>次被访问</h1>
        <%=response.encodeURL("index.jsp") %>
        
    </body>
</html>



JSP的URL重写需要使用response.encodeURL()或者response.encodeRedirectURL()函数。


禁用cookie后,重启浏览器,访问:http://localhost:8080/HelloJSP/index.jsp,可以看到:


这次请求的请求头为:
GET /HelloJSP/index.jsp HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Cache-Control: max-age=0



响应头为:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=F9601165EF1988B1A7A60B7D82CD89F8; Path=/HelloJSP/; HttpOnly
Content-Type: text/html;charset=UTF-8
Content-Length: 350
Date: Tue, 13 Jan 2015 07:24:00 GMT


可以看到,请求头中没有Cookie字段。而响应头通过Set-Cookie字段试图在浏览器端创建cookie。 Set-Cookie中的sessionid和response.encodeURL("index.jsp")输出的sessionid是相同的。但是浏览器端禁用了cookie,所以无论刷新多少次(刷新一次请求一次),response.encodeURL("index.jsp")的输出的url结果中都会附带session信息,而请求头都不会有Cookie字段。另外,tomcat每次试图建立会话都没有成功,每次的sessionid也不同。


启用cookie,重启浏览器:
第一次访问http://localhost:8080/HelloJSP/index.jsp,如下:


HTTP请求头如下:
GET /HelloJSP/index.jsp HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Cache-Control: max-age=0

请求头中依然没有Cookie字段。

HTTP响应头如下:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=857B1655EF5614E9C827B06FB407F512; Path=/HelloJSP/; HttpOnly
Content-Type: text/html;charset=UTF-8
Content-Length: 350
Date: Tue, 13 Jan 2015 07:26:14 GMT


由于启用了cookie,所以Set-Cookie给出的信息会存储到cookie中。
然后刷新浏览器,得到:



这一次输出的url中没有session信息了。看一下HTTP请求头:

GET /HelloJSP/index.jsp HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Cookie: JSESSIONID=857B1655EF5614E9C827B06FB407F512
Connection: keep-alive
Cache-Control: max-age=0



这一次请求中有Cookie了,且和上一次请求的响应给出的cookie是相同的。

再看一下响应头:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 307
Date: Tue, 13 Jan 2015 07:28:15 GMT



Tomcat看到客户端给出了cookie信息,也就不去set-cookie了。

据此, 可得response.encodeURL(String url) 的思路如下:
如果浏览器请求头中给出了cookie,那么对url什么都不做;如果没有cookie则认为浏览器可能禁用了cookie或者是第一次访问,在url中加入sessionid信息。







转载于:https://my.oschina.net/letiantian/blog/367192

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值