什么是Cookie?
Cookie是服务器在本地机器上存储的小段文本,它是一个简单的字符串形式的键值对。
网络服务器用HTTP头向客户端发送cookie,
(一般情况下Cookie是由服务端生成的,当然js也能操作cookie)
在客户端,浏览器解析这些cookies并将它们保存到本地,
而后当浏览器访问这个服务器时,它会在任何请求上加上这些cookie。
说白了就是每次你和服务器的交互都会带着这些cookie。
什么是Session?
session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接。
然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”。
而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session。
说的通俗一点~
Cookie
Cookie在服务器端产生的,以文件的形式保存在客户端的,客户端每次发送请求,都会将相应的Cookie发送给服务器端
session
创建于服务器端,保存于服务器,维护于服务器端,每创建一个新的Session,服务器端都会分配一个唯一的ID,并且把这个ID保存到客户端的Cookie中,保存形式是以JSESSIONID来保存的。
当浏览器被禁用Cookie的时候,session不能使用的时候,就采用重写URL,就是在URL地址后加上JSESSIONID
String url = response.encodeURL(path);
response.sendRedirect(url);
我们知道session是在服务端的,http又是无状态协议,而seesion又是靠session id来区分的,
因此为了传递session id让服务器识别,这个session id就存放在了cookie中。
因为每次向服务器发送请求时,http头都会带着cookie,
所以服务端就很方便地根据cookie读取出来的session id来区分各个请求的session。
在Servlet代码中写上:
<span style="font-size:18px;">HttpSession session=request.getSession();</span>这样就能创建一个session了~
用火狐访问,查看firebug的网络信息,我们可以发现他的响应信息中有
Set-Cookie JSESSIONID=5A810D07A1FB78122FFC2A74CA04F255; Path=/Test01/; HttpOnly
这些字样,这说明访问服务器的时候,服务端把seesion id写入到了cookie,
让客户端浏览器把cookie保存起来。
到这里我们似乎可以发现些什么,不知道你看到没有?
发送请求的时候带着cookie信息,
从响应信息里我们又看到了让浏览器设置cookie的信息,发送请求响应
从而我们可以得出,在servlet中,想获得cookie,我们需要从request中取,
下面这段代码就可以在控制台中把客户端过来的cookie信息都打印出来。
TwoCookie:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub Writer out=response.getWriter(); //查找所有的Cookie,向服务器发送请求,来得到Cookie Cookie[]cookies=request.getCookies(); if(cookies!=null){ for(Cookie cookie:cookies){ out.write(cookie.getName()+" "+cookie.getValue()); } }else{ out.write("cookie is null"); } }
而当你想添加cookie时就得往response里添加。
OneCookie:
//创建cookie Cookie c=new Cookie("keys", "T-Sshirt"); c.setMaxAge(30);//30秒不改变,持久30秒 response.addCookie(c);添加了这个cookie后,你会在刚才控制台的cookie打印中看到你这个mycookie信息。
然后就可以在Session中写下以下代码:
OneSession:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub HttpSession session=request.getSession(); session.setMaxInactiveInterval(30); request.setCharacterEncoding("UTF-8"); String usrename=request.getParameter("username"); session.setAttribute("name", usrename); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub HttpSession session=request.getSession(); String name=(String) session.getAttribute("name"); response.setCharacterEncoding("UTF-8"); response.addHeader("Content-Type", "text/html; charset=UTF-8"); Writer out=response.getWriter(); out.write("name is"+name); }
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>index.jsp</title> </head> <body> <hr> <form action="OneSession" method="post"> 用户名:<input type="text" name="username"> <br> <input type="submit" value="登录"> </form> </body> </html>index.jsp是在webcontent目录下的,看下图: OneCookie,TwoCookie,OneSession,TwoSession都是继承HttpServlet的~
先要在浏览器运行TwoCookie,然后运行项目下面的index.jsp跳转到OneSession,在运行TwoSession~
效果图如下:
最后讨论一下Session失效:
1.关闭浏览器的时候
2.httpSession.invalidate();
3.设置httpSession的最大存活期
a:httpSession.setMaxInactiveInterval(10);不活动时间为10秒
b: <session-config>
<session-timeout>30</session-timeout>
</session-config> 不活动时间30分钟