cookie的基础以及小案例

1.会话技术

  

用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器关闭的过程称为是一次会话
cookie:将数据保存到客户端浏览器
session:将数据保存到服务器端

向浏览器保存数据:
response.addCookie(Cookie cookie)
获取浏览器带过来的数据:
request.getCookies();
创建cookie对象:
cookie(String name,String value);

2.JSP的简单概述

jsp:java代码+html的元素+jsp内置的东西
jsp的执行过程:
jsp会被翻译成servlet,编译成class进行执行
jsp的脚本元素:
<%! %>:翻译成类中的成员部分,定义变量,定义方法,定义类,Servlet是线程不安全的,尽量少在类中定义成员变量
<% %>:翻译成类的service方法内部的内容,定义变量,定义类,直接写代码块
<%= %>:翻译成service方法内部的out.print();

3.记录用户的上次登录访问时间

public class ServletDemo1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取当前时间
        String time = new Date().toLocaleString();
        //获得所有cookie
        Cookie[] cookies = request.getCookies();
        //遍历cookies判断有没有记录登录时间的cookie
        if(cookies != null) {
            for (Cookie cookie : cookies) {
                //如果匹配到保存时间的cookie,用户不是第一次访问
                if(cookie.getName().equals("visitTime")) {
                    String visitTime = cookie.getValue();
                    response.getWriter().write("欢迎回来,上次访问的时间是:"+cookie.getValue());
                }
            }
        }else {
            response.getWriter().write("欢迎访问本网站!");
        }
        //创建cookie对象保存
        Cookie c = new Cookie("visitTime", time);
        //发送cookie
        response.addCookie(c);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

4.cookie常用的api

getName();获得名字
getValue();获得对应的值
setDomain(String domain);设置cookie的有效域名
setPath(String path);设置cookie的有效路径
setMaxAge(int maxAge);设置cookie的有效时间

5.cookie的分类

会话级别的cookie:默认的cookie,关闭浏览器cookie就会销毁
持久级别的cookie:可以设置cookie的有效时间,那么关闭浏览器cookie还会存在,手动销毁持久性Cookie.setMaxAge(0);

6.商品的浏览历史记录

步骤:
点击某个商品,将商品ID传递给一个Servlet
在Servlet中判断是否是第一次浏览商品
如果是第一次:将商品ID存入到cookie中
如果不是,判断商品是否被浏览过,如果浏览过,就 删除对应的cookie,添加到首尾,没有就判断是否达到浏览商品显示的最大值,
如果没有就直接添加到第一个,如果达到了就删除最后一个,再添加都首位

public class ServletDemo2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收用户点击商品传递过来的id
        String id = request.getParameter("id");
        //获得所有的cookie信息
        Cookie[] cookies = request.getCookies();
        //判断有没有浏览过这个商品
        Cookie cookie = CookieUtils.findCookie(cookies,id);
        //用户是第一次浏览
        if(cookie == null) {
            //创建cookie对象
            Cookie c = new Cookie("history", id);
            //设置一个小时的销毁
            cookie.setMaxAge(60*60);
            //发送cookie
            response.addCookie(c);
            //用户不是第一次浏览
        }else {
            //得打cookie的值
            String value = cookie.getValue();
            //切掉在拼接cookie时的,号
            String[] ids = value.split(",");
            //将数组转换成集合
            List<String> aslist = Arrays.asList(ids);
            //将list转换成linkedlist
            LinkedList<String> list = new LinkedList<>(aslist);
            //如果用户之前浏览过这个商品
            if(list.contains(id)) {
                //删除对应的
                list.remove(id);
                list.addFirst(id);
                //没有浏览过
            }else {
                //判断是否达到最大值
                if(list.size() < 3) {
                    //直接添加到第一个
                    list.addFirst(id);
                    //达到最大值
                }else {
                    //删除最后一个
                    list.removeLast();
                    list.addFirst(id);
                }
            }
            //创建拼接的StringBuffer
            StringBuffer sb = new StringBuffer();
            for(String s:list) {
                sb.append(s).append(",");
            }
            //去掉最后一个,号
            String idValue = sb.toString().substring(0,sb.length()-1);
            //保存到cookie中
            Cookie c = new Cookie("history", idValue);
            //发送
            response.addCookie(c);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
class CookieUtils {

    public static Cookie findCookie(Cookie[] cookies,String name){
        if(cookies == null){
            return null;
        }else{
            for(Cookie cookie:cookies){
                if(name.equals(cookie.getName())){
                    return cookie;
                }
            }
            
            return null;
        }
    }
}

7.清空浏览历史记录

点击清空浏览历史记录的超链接,
跳转到servlet
得到指定保存浏览历史记录的cookie,
设置保存时间为0
重定向到商品显示页面

public class Demo3Servlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得所有的cookie
        Cookie[] cookies = request.getCookies();
        //遍历cookies,拿到保存浏览历史记录的cookie
        for (Cookie cookie : cookies) {
            if(cookie.getName().equals("history")) {
                //设置保存时间为0
                cookie.setMaxAge(0);
            }
        }
        //重定向
        response.sendRedirect(request.getContextPath()+"/list.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
原文地址:https://www.cnblogs.com/learnjfm/p/6912539.html