首页 > 代码库 > 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(); // ... }}