Servlet第三篇-Cookie和Session

什么是Cookie

关于cookie和session,之前写的爬虫文章就讲的很清楚啦:爬虫Day12-代理请求

没看过没有关系!下面我就指出重点:

网页之间的交互是通过HTTP协议传输数据的,而Http协议是无状态的协议。无状态的协议是什么意思呢?一旦数据提交完后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建立新的连接

那么,为了识别用户,服务端给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie。


  • Cookie类用于创建一个Cookie对象
  • response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段
  • request接口中定义了一个getCookies方法,它用于获取客户端提交的Cookie

为了体验cookie的添加与获取,我编写了下面这两个jsp页面:

①cookie.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
</form>
<%
// 将用户填写的信息添加到cookie中
Cookie cok1 = new Cookie("name", "sz");
Cookie cok2 = new Cookie("pwd", "abc");
response.addCookie(cok1);
response.addCookie(cok2);

response.sendRedirect("result.jsp");
%>
  • 对于我们来说,比较新鲜的就是new Cookie了,由于Cookie并不是内置对象,所以需要先new
  • 接着添加cookie,这是利用response做的

②result.jsp

1
2
3
4
5
6
7
8
<%
Cookie[] coks = request.getCookies();
for (Cookie cok : coks) {
out.print(cok.getName()+ "---" + cok.getValue());
out.print("<br>");
}

%>
  • 用高级for循环,遍历cookie,调用cookie的API方法:getName和getValue,然后打印出来

浏览器看到的效果:

  • 可以看到,cookie按照我们定义的方式打印出来了
  • JSESSIONID标识cookie(后面会讲到),还有一个idea,是idea自动帮我们添加的

于是,服务端可以这样,先获取name,判断用户身份,然后提供特定服务。


Cookie的有效期

Cookie的有效期是通过setMaxAge()来设置的

  • 如果MaxAge为正数浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效【不论关闭了浏览器还是电脑】
  • 如果MaxAge为负数Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。
  • 如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie



如果我们没指定cookie的有效期,默认是在关闭浏览器时,cookie就清除。


cookie的应用

cookie是这样的,第一次访问时,客户端并没有cookie,于是服务端使用set-cookie字段进行设置(cookies不是客户端自动生成的)。在第二次访问时,客户端会携带对应cookie进行访问。

cookie结合session,就能实现”用户识别“的效果了。等我们讲完session,会展开描述。




什么是Session

Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session

如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当于在服务器中建立了一份“客户明细表”。


①生成sessionid

客户端第一次请求服务端时,服务端会产生个session对象(用于保存该客户的信息) ; .并且每个session对象都会有一个唯一的sessionId( 用于区分其他session) ;

②发送sessionid

同时,服务端由会产生一个cookie, 并且将该cookie的name= JSESSIONID , value=服务端sessionid的值。然后服务端会在响应客户端的同时将该cookie发送给客户端,至此客户端就有了一个cookie (JSESSIONID)

③sessionid识别

根据客户端发来的cookies字段中的JSESSION,识别会话对象


这样,客户端和服务器端就一一联系起来了



Session的API:

  • session的常用API就在这了,反正…我是不背的,用到了再查咯(我不会告诉你这就是写博客的好处之一!)

用户识别

当客户端第二次、或N次,在cookie失效之前去访问服务端,那么服务器就会拿着客户端携带的JSESSIONID与sessionid进行匹配,这样就完成了认证。

于是,我们登陆了京东、淘宝之后,关闭浏览器,在一定时间内,继续登陆该网站,我们可以不需要重新登陆,这就是cookie和session的结合应用了。



域范围对象

就着今天的session话题,我们在引入一个概念:域范围对象。其实,我们上一篇的request,response也是域范围的一种。

在tomcat中,有这么四种域范围对象:

名称 作用域范围
pageContext JSP 页面容器(page对象) 当前页面有效,
Request 请求对象 同一次请求有效
Session 会话对象 同一次会话有效
appliation 全局对象 全局有效(整个项目有效)

以上对象共有的方法:

  1. 0bject getAttribute(String name) : 根据属性名获取属性值

  2. void setAttribute (String name, Object obj) :设置属性值(新增,修改)

    setAttribute(“a”,”b”) 的两种情况:

    • 如果a对象之前不存在,则新建一个a对象;
    • 如果a之前已经存在,则将a的值改为b
  3. void removeAttribute (String name):根据属性名,删除对象


生效范围

1.pageContext 当前页面有效(页面跳转后无效)

2.request 同一次请求有效;其他请求无效 (请求转发后有效;重定向后无效)

3.session 同一次会话有效(无论怎么跳转,都有效;关闭/切换浏览器后无效;

4.application 全局变量;整个项目运行期间都有效(切换浏览器仍然有效) 但是关闭服务、或者其他项目访问无效


知道这个有什么用呢?四种域范围对象都有属性设置、属性获得的API,这就跟域范围对象有关。我们设置的参数,根据这些域对象的生命周期相关。在项目中,我们要挑选适合的域对象来保留参数。