会话技术 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;

    @Override
    protected 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();
                //判断名称是否为lastTime
                if ("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的值,重新发送cookie
                    Date 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的值,重新发送cookie
            Date 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永不过期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值