Java日志二十四「Cookie」

**

Cookie

**
在了解什么是Cookie前,我们现介绍一下一个概念:一次会话。

一次会话:浏览器第一次给服务器资源发送请求,会话建立。直到有一方断开为止

两种会话技术:
客户端会话技术(Cookie)
服务器会话技术(Session)

Cookie是把数据保存到客户端的技术。

作用:
1.用于存储少量不敏感的数据
2.在用户不登陆的情况下,完成服务器对用户的身份识别

关于Cookie的一些细节:
1.可以创建多个Cookie对象发送给浏览器
2.默认情况下当浏览器关闭后,Cookie数据被销毁,而setMaxAge方法传递一个int参数:
正数代表了持久化存储,数字代表了Cookie在硬盘文件能存活多少秒(在这个时间内用其他浏览器请求某服务器也可以查看到Cookie)
负数(就是默认情况)
零代表使这个调用这个方法的Cookie对象无效化

3.在Tomcat8之后,Cookie才支持中文数据
4.若在一个Tomcat中部署了多个web项目,那么Cookie在默认情况下不可以在这些项目中共享
可以使用setPath方法传递一个更上级的目录,使得Cookie可以被共享

在简单介绍后,我们来看一下代码:
在这个Servlet中向浏览器发送一个Cookie

@WebServlet("/demo1")
public class Servlet_cookie1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c=new Cookie("msg","Hello");
        //2.发送Cookie
        response.addCookie(c);
    }

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

在这个Servlet中把Cookie内容获取

@WebServlet("/demo2")
public class Servlet_cookie2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //3.获取Cookie
        Cookie[] cs=request.getCookies();
        //遍历
        if(cs!=null){
            for (Cookie c : cs) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);
            }
        }

    }

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

结果

JSESSIONID:CEC6CBE51C3F6C5510DE5E9326F74FE6
msg:Hello
Idea-765bc675:d223a34d-972b-4a03-8494-266e699b06f0

第一行和第三行不是我们设置的Cookie,不需要去管它。第二行是我们设置的Cookie的内容,成功的被获取了。

下面我们做一个小案例联系一下Cookie
需求:
若是第一次访问服务器,打印首次访问
若不是第一次访问服务器,显示上一次的访问时间

代码:

@WebServlet("/Servlet_cookie_case")
public class Servlet_cookie_case extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        boolean flag=false;
        Cookie[] cs=request.getCookies();
        if(cs!=null && cs.length>0){
            for (Cookie c : cs) {
                String name = c.getName();
                if ("lastTime".equals(name)){//代表不是第一次访问,打印信息并且重设cookie的value
                    flag=true;
                    Date date=new Date();
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//这个格式里面有一个空格,属于特殊字符,要用URL来解码编码
                    String s = simpleDateFormat.format(date);
                    s= URLEncoder.encode(s,"utf-8");//编码
                    c.setValue(s);
                    c.setMaxAge(60*60);
                    response.addCookie(c);

                    String value=c.getValue();
                    value= URLDecoder.decode(value,"utf-8");//解码
                    response.getWriter().write("欢迎回来,上次访问时间为"+value);
                    break;
                }
            }
        }

        if(cs==null || cs.length==0 || flag==false ){
            Date date=new Date();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String s = simpleDateFormat.format(date);
            s= URLEncoder.encode(s,"utf-8");//编码
            Cookie c=new Cookie("lastTime",s);
            c.setMaxAge(60*60);
            response.addCookie(c);
            response.getWriter().write("欢迎首次访问");
        }

    }

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

第一次访问:
在这里插入图片描述
第二次访问(我这里就是刷新了一下页面):
在这里插入图片描述
下次更新session会话技术。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值