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=\”” + 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();
    // ...
  }
}

Head-First Servelts&JSP reading note 4

时间: 2024-08-09 06:32:29

Head-First Servelts&JSP reading note 4的相关文章

Head-First Servelts&amp;JSP reading note 3

<servlet> <servlet-name>BeerParamTests</servlet-name> <servlet-class>TestInitParams</servlet-class> <init-param> <param-name>adminEmail</param-name> <param-value>[email protected]</param-value> &

Head-First Servelts&amp;JSP reading note 5

Filter 过滤器就是一个对所有的请求进行intercept(拦截),然后对请求进行相应的处理,或者servlet处理完成之后,对response进行处理等. 而这一切,servlet永远不可能知道. Filter和Servlet的相同点 1 容器也知道Filter的API 一旦一个java类实现了Filter接口,他就正式的成为了一个过滤器,容器中它也就被注册了. 2 容器管理他们的生命周期 他们也有init和destory方法,不同的是servlet有service方法(doGet/doP

thinking in java ----reading note (1)

# thinking in java 4th# reading note# victor# 2016.02.10 chapter 1 对象入门 1.1 抽象的进步    (1) 所有东西都是对象.    (2) 程序是一大堆对象的组合,对象间通过消息联系.    (3) 通过封装现有对象,可制作出新型对象.    (4) 每个对象都有一种类型(某个类的实例).    (5) 同一类的所有对象都能接受相同的消息.    1.2 对象的接口 & 1.3 实现方法的隐藏     接口规定了可对一个特定

jQueryInAction Reading Note 7.

jQuery插件命名规则 jquery.pluginName.js pluginName指代的是插件的名称,如voctrals,tlaliu或者更有意义的名称. 简化jQuery函数的参数列表 如果有一个函数有多个参数,但是并不是每一个参数都是必须的,可以把必须的参数放到前面,不必须的参数包装成一个object. 如: function complex(param, options){ var settings = $.extend( { option1 : defaultValue1, opt

jQueryInAction Reading Note 6.

这一章的前面一部分实在是无法理解,略过吧... $.noConflict() 无参数,无返回值,是用来把$符号交给其它的javascript库的. 但是并没有放弃使用jQuery的意思,jQuery仍然可以使用,并且可以把jQuery指派给另外一个别的名称,如$j,但是仍然会让人不爽. 但是如果在调用了$.noConflict()方法之后,还是想要使用$的话,可以使用一种方法,这种方法说白了就是设定一个形式参数$,而形式参数对应着的实体参数是jQuery,也就是说使用函数的方式. functio

thinking in java -----reading note(2)

# thinking in java 4th# reading note# victor# 2016.02.16 chapter 2 一切都是对象 2.1 用句柄操纵对象    使用句柄作为标识符指向一个对象.但拥有句柄并不意味着有一个对象同它连接.    例如,创建一个String句柄: String s;    此时,这里创建的是句柄,并不是对象.如果向s发一条消息,就会获得一个错误.因此,较为安全的做法是:创建一个句柄时,无论如何都进行初始化. 2.2 创建对象    通常使用 new 关

thinking in java ----reading note (3)

# thinking in java 4th# reading note# victor# 2016.03.13 chapter 3 控制程序流程 3.1 java 运算符    几乎所有运算符都只能操作"基本值类型"."=","=="和"!=" 能操作所有对象,String类支持"+"和"+=". 3.1.1 优先级    运算符的优先级决定了存在多个运算符时一个表达式个部分的计算顺序

jQueryInAction Reading Note 3.

属性和特性 操作元素属性 jQuery没有用于获取或者修改元素属性的命令.需要利用javascript,首先需要做的就是获得元素的引用. each(function) 对包装集中的各个元素,进行function操作,function有默认的参数为当前元素的位置,function具有当前对象this的引用. $("img").each(function(n){ this.alt = "this is " + n+1 + "th img, id is &quo

jQueryInAction Reading Note 5.

$(function(){ $('li:has(ul)') .click(function(event){ if (this == event.target){ if($(this).children().is(':hidden')){ $(this) .css('list-style-image', 'url(minus.gif)') .children().show(); } else { $(this) .css('list-style-image', 'url(plus.gif)') .