会话技术Cookie

1.会话技术的概念
  • 会话∶浏览器和服务器之间的多次请求和响应。
  • 为了实现一些功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器、到了过期时间)。这期问产生的多次请求和响应加在一起就称之为浏览器和服务器之间的一次会话。
  • 会话过程中所产生的一些数据,可以通过会话技术( Cookie和Session )保存。
2.Cookie的概念
  • Cookie :客户端会话管理技术把要共享的数据保存到客户端。
  • 每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享!
  • 作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中就取,以此提高效率
  • -cookie有大小和个数限制:每个网站最多只能存20个Cookie,所有网站加起来最多只能存300个Cookie。每个Cookie的大小不能超过4KB
3.Cookie的添加和获取
//cookie把数据保存在客户端
//Session把数据保存在服务端,且依赖于cookie
@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求字符编码,防止乱码
        req.setCharacterEncoding("utf-8");
        //设置浏览器响应编码[html类型的文本,字符集为utf-8]
        resp.setContentType("text/html;charset=utf-8");
        //1.通过响应对象写出提示信息
        PrintWriter pw = resp.getWriter();
        pw.write("最后浏览时间为<br/>");
        //2.创建Cookie对象,用于记录最后访问时间
        Cookie cookie = new Cookie("time", System.currentTimeMillis() + "");
        //3.设置最大存活时间
        cookie.setMaxAge(3600);
        //4.将cookie对象添加到客户端
        resp.addCookie(cookie);
        //5.获取cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie c : cookies) {
           //if("time".equals(c.getName())){
            if(c.getName().equals("time")){
               String value = c.getValue();
               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
               pw.write(sdf.format(new Date(Long.parseLong(value))));
           }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
4.Cookie的路径限制

【取自第一次访问的资源路径前缀,只要以这个前缀为开头(包括子级路径)。获取到反之获取不到】
@WebServlet("/servlet/aaa/ServletDemo4")可以获取到
@WebServlet("/bbb/servlet/ServletDemo5")不可以获取

//cookie的路径限制
@WebServlet("/servlet/ServletDemo3")
//取自第一次访问的资源路径前缀,只要以这个前缀为开头(包括子级路径)。获取到反之获取不到
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建Cookie并添加
        Cookie cookie = new Cookie("username", "zhangsan");
        cookie.setMaxAge(3600);//s
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
5.例子:最后浏览时间
@WebServlet("/ServletDemo2")
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求字符编码,防止乱码
        req.setCharacterEncoding("utf-8");
        //设置浏览器响应编码[html类型的文本,字符集为utf-8]
        resp.setContentType("text/html;charset=utf-8");
        //1.获取所有的Cookie对象
        //需要加非空判断
        PrintWriter pw = resp.getWriter();
        Cookie[] cookies = req.getCookies();
        if(cookies==null){
            //如果为空,说明第一次访问,使用Cookie记录这一次访问的时间
            Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
            cookie.setMaxAge(3);
            resp.addCookie(cookie);
            pw.write("欢迎光临,第一次访问");
            return;
        }
            //2.查找lasttime名称的Cookie是否存在
            int index = -1;
            for (int i = 0; i < cookies.length; i++) {
                //可以加个cookies[i]判空
                if (cookies[i].getName().equals("lasttime")) {
                    index = i;
                    break;
                }
            }
            //如果不存在,说明第一次访问,使用Cookie记录这一次访问的时间
            if (index == -1) {
                Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
                cookie.setMaxAge(3);
                resp.addCookie(cookie);
                pw.write("欢迎光临,第一次访问");
            }
            //如果存在,说明不是第一次访问,使用Cookie响应给浏览器这一次的时间
            if (index != -1) {
                String value = cookies[index].getValue();
                SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                pw.write("欢迎回来,上次访问时间</br>" + sdt.format(new Date(Long.parseLong(value))));
                //并设置新时间
                cookies[index].setValue(System.currentTimeMillis() + "");
                resp.addCookie(cookies[index]);
            }
        }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陪雨岁岁年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值