会话技术 Cookie和Session对象
一、会话概述
客户端与服务器之间的一次交互过程中将双方的一些数据进行保存,Servlet提供了两个用于保存会话数据的对象,分别是Cookie和Session。
二、Cookie对象
2.1 概念
cookie的功能就是保存用户上一次访问时留存下的数据,当该浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确地响应。
当服务器向客户端发送Coolie时,会在HTTP响应头中增加Set-Cookie响应头字段,Cookie必须以键值对的形式存在,Cookie属性可以有多个,属性之间用分号“;”和空格分隔。
2.2 Cookie构造方法
public CookieString name,String value):参数name用于指定Cookie的名称,value用于指定Cookie的值 ,Cookie一旦创建,它的名称就不能再更改,Cookie的值可以为任何值,创建后允许被修改。
2.3 Cookie常用方法
setMaxAge(int expiry)和getMaxAge()方法分别用于设置和返回Cookie在浏览器上保持有效的秒数。设置正数,没有超过时间,一直有效,即便关闭浏览器。设置负数,将Cookie信息保存缓存,浏览器关闭,Cookie信息被删除。设置为0,浏览器立刻删除Cookie信息。
setPath(String uri)方法和getPath()方法是针对Cookie的Path属性的。如果创建的某个Cookie对象没有设置Path属性,那么该Cookie只对当前访问路径所属的目录及其子目录有效。如果想让某个Cookie项对站点的所有目录下的访问路径都有效,应调用Cookie对象的setPath()方法将其Path属性设置为“/”。
setDomain(String pattern)方法和getDomain()方法是针对Cookie的domain属性的。domain属性用于指定浏览器访问的域。
案例实现
@WebServlet("/lastTime")
public class DemoTime01 extends HttpServlet {private static final long l = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");//获取会话对象Cookie[] cookies = req.getCookies();boolean flag = false;//遍历if (cookies.length > 0 && cookies != null) {for (Cookie cookie : cookies) {//获取Cookie名称String name = cookie.getName();//判断名称是否为lastTimeif ("lastTime".equals(name)) {//不是第一次访问,获取时间flag = true;String value = cookie.getValue();System.out.println("解码前:" + value);//URL解码value = URLDecoder.decode(value, "utf-8");System.out.println("解码后:" + value);resp.getWriter().write("欢迎回来,您上次访问时间为:" + value);//设置cookie的value//获取当前时间的字符串,重新设置cookie的值,重新发送cookieDate date = new Date();SimpleDateFormat timesdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_time = timesdf.format(date);System.out.println("编码前:" + str_time);//URL编码str_time = URLEncoder.encode(str_time, "utf-8");System.out.println("编码后:" + str_time);cookie.setValue(str_time);//设置cookie存活时间cookie.setMaxAge(60 * 60 * 24 * 30); //一个月//加入当前cookie请求时间resp.addCookie(cookie);break;}}}//如果cookies中没有时间,也就是没有访问过if (cookies == null || cookies.length == 0 || flag == false) {//设置cookie的value//获取当前时间的字符串,重新设置cookie的值,重新发送cookieDate date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String str_date = sdf.format(date);System.out.println("编码前:" + str_date);//URL编码str_date = URLEncoder.encode(str_date, "utf-8");System.out.println("编码后:" + str_date);Cookie cookie = new Cookie("lastTime", str_date);//设置cookie存活时间cookie.setMaxAge(60 * 60 * 24 * 30);//一个月resp.addCookie(cookie);resp.getWriter().write("您好,欢迎您首次访问");}}
}
运行结果
第一次访问
刷新后访问
三、Session对象
3.1 概念
当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,当客户端后续访问服务器时,只要将ID传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。在这个过程中,Session会将id属性交给cookie存储,之后通过id属性在服务器找到session对象。
3.2 Session常用方法
获取session对象:
- public HttpSession getSession(boolean create):根据传递的参数判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null。
- public HttpSession getSession():相当于第一个方法参数为true时的情况,由于getSession()方法可能会产生发送会话标识号的Cookie头字段,所以必须在发送任何响应内容之前调用getSession()方法。
3.3 Session的生命周期
Sessinon在用户第一次访问服务器时创建,需要注意只有访问JSP(JSP将在第6章讲解)、Servlet等程序时才会创建Session。此外,还可调用request.getSession(true)强制生成Session。只访问HTML、IMAGE等静态资源并不会创建Session.
当客户在一段较长的时间内没有请求访问,那么web服务器会结束请求。
session失效(强制)
可以强制生成session,也可以强制摧毁:invalidate()方法,该方法可以强制使Session对象失效。
设置时间失效
Tomcat服务器下的web.xml中默认是30分钟失效
第一种:在web.xml中
<!--单位为分钟--><session-config><session-timeout>30</session-timeout></session-config>
第二种:在Servlet程序中手动设置
session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期