首页 > 代码库 > Head-First Servelts&JSP reading note 4

Head-First Servelts&JSP reading note 4

HttpSession

Http协议

Http协议是无状态的stateless,所以一个用户对服务器访问的话,不管多少次,服务器都会像第一次被访问一样。也就是说服务器不会区别用户。

一个请求过来,服务器会给一个相应,然后之间的联系就断了。

 

Session

如何让服务器能够识别出来两个请求是来自同一个客户的呢?设置一个唯一的ID,这个ID叫做SessionId。

当服务器响应一个请求的时候,会附带着把这个sessionId放到response中,在紧接着的request的时候,会把这个sessionId也传递给服务器,服务器在接受请求的时候会首先去寻找是否有相对的SessionId,如果有的话,他就能够识别到这个用户以前访问过。

 

Cookies

服务器需要给客户端的response中追加一个seesion ID,而客户端也需要request的时候伴随着一个session ID。最通常也是最简单的方式就是运用客户端的cookie。

在response中有一个header的key是“Set-Cookie”

在request中有一个header的key是“Cookie”

  

在一个response中返回一个Session Cookie:

HttpSession session = request.getSession();

就这样,没有自己去新建一个HttpSession;

没有自己去生成一个SessionId;

没有自己去制作一个Cookie;

没有去把一个session Id和一个Cookie关联起来。

完成上面的工作的都是Container。

 

在一个request中获得一个Session Id

HttpSession session = request.getSession();

这跟上面是一样的,如果request当中包含了一个session id cookie的话,会返回这个session;不然的话,创建一个session id cookie。

 

request.getSession();返回的session对象有一个isNew()的方法,这个方法能够判断出这个session是已经存在的还是刚刚新建出来的。

 

如果就是想要原来的session,而不是新建一个session对象的话,可以使用request.getSession(false);

这个方法要是返回值不是null的话,返回的结果就是原来存下来的session对象了。

 

A client with cookies disabled will ignore “Set-Cookie” response headers


URL rewriting

如果客户端把cookie给禁止了的话,session也是可以使用的,不过需要做些其它的工作。

URL重写,一个可以依赖的方式

public void doGet(HttpServletRequest request, HttpServletResponse response)  throws IOException {  response.setContentType(“text/html”);  PrintWriter out = response.getWriter();  HttpSession session = request.getSession();  // must do this, 不然的话response.encodeURL()的时候没有sessionId  out.println(“<html><body>”);
  // response.encodeURL("/BeerTest.do"),会生成带有sessionId=xasdaasdfcfera字符串的对象。  out.println(“
<a href=http://www.mamicode.com/”” + response.encodeURL(“/BeerTest.do”) + “\”>click me</a>”);  out.println(“</body></html>”);}

重定向,可是依然想要使用session对象的话:

response. encodeRedirectURL(“/BeerTest.do”)

 

注意:如果一个页面中有多个link是与session相关的,那么这些link都需要被重写。没有一种办法把所有的link都重写了。

注意:所有的URL重写都是HttpServletResponse对象的,不是request对象的~

 

警告:我们不应该创建一个jessionid的parameter,并且request的header中有一个cookie,而jsessionid是它的一个键值对。

关键点:

1 URL重写(response.encodeURL("some")),会给所有你重写的URL后面追加上一个session id。

2 被重写的URL,请求服务器的时候,jssesionid会作为一个附加信息存在于URL的末端。

3 URL重写只有在客户端禁止了cookie的时候才会起作用,但是我们有理由去追加一个url重写,不定哪一个脑残的就把cookie禁止了。

4 没有给一个静态页面中所有的URL重写的机制,所以如果想要重写URL的话,需要运用动态加载的方式,也就是在服务器端做好response.encodeURL("/dome.do")

 

Session消亡的三种形式

  • time out
  • session.invalidate();
  • application shut down.^.^

在web.xml中追加如下设置即可设定session过期的时间,其中15是min

<session-config>    <session-timeout>15</session-timeout></session-config>

session.setMaxInactiveInterval(int second),需要注意这个方法的参数是

session.setMaxInactiveInterval(20*60); 这是用来设定session time out的。

 

Cookie的使用

当然,cookie的存在就是为了sessionID相关的内容,但是也可以做一些其他东东西。

HttpServletRequest.getCookies();  // 获得到cookie信息

HttpServletResponse.setCookie();  // 追加一个cookie

Cookie是一个键值对

Cookie cookie = new Cookie("userName", "Voctrals Lou");

cookie.setMaxAge(60 * 30);  // 设置cookie过期时间为30分钟

cookie.setMaxAge(-1);  // 设置cookie立马失效

response.addCookie(cookie);

 

Cookie[] cookies = request.getCookies();for (int i = 0; i < cookies.length; i++){  Cookie cookie = cookies[i];  if (cookie.getName().equals("userName")){    String userName = cookie.getValue();    // ...  }}