Cookie和Session

HTTP协议是一个无状态的协议,服务器无法区分出两次请求是否发送自同一服务器。所以需要通过会话控制来解决这个问题,会话控制主要有两种方式Cookie 和 Session。

一、Cookie

1、什么是Cookie

Cookie就是一个头,Cookie由服务器创建,服务器以响应头的形式发送给客户端,客户端收到Cookie以后,会将其自动保存,在下次向服务器发送请求时会自动将Cookie以请求的形式发出,服务器收到以后就可以检查请求头中的Cookie并且可以根据Cookie中的信息来识别出不同的用户。

Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据。
浏览器需要保存这段数据。此后每次浏览器访问该服务器,都必须带上这段数据。
cookie存放在硬盘之中。

2、怎么创建Cookie

在这里插入图片描述

protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //创建cookie
        Cookie cookie1=new Cookie("key1","value1");
        Cookie cookie2=new Cookie("key2","value2");
        //通知客户端保存cookie
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);

        resp.getWriter().write("Cookie创建成功");
    }

3、怎么获取Cookie

在这里插入图片描述

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        for(Cookie c:cookies){
            //getName()返回cookie返回cookie的key(名)
            //getValue()方法返回cookie的value(值)
            resp.getWriter().write("Cookie["+c.getName()+"="+c.getValue()+"]<br>");
        }
        //此处使用的findCookie方法是 自己定义的一个方法,因为经常会用,所以封装成一个方法了
        Cookie iwantCookie= CookieUtils.findCookie("key1",cookies);
//        for(Cookie c:cookies){
//            if("key1".equals(c.getName())){
//                iwantCookie=c;
//                break;
//            }
//        }
        if(iwantCookie!=null){
            resp.getWriter().write("找到了key1");
//            System.out.println("找到了key1");
        }
    }
    //其中的findCookie方法
    public static Cookie findCookie(String name,Cookie[] cookies){
        if(name==null || cookies==null || cookies.length==0){
            return null;
        }
        for(Cookie cookie:cookies){
            if(name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }

4、Cookie值的修改

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方案一:
        //创建一个同名的cookie对象,同时赋予新的值
//        Cookie cookie=new Cookie("key1","qwe");
//        resp.addCookie(cookie);

        //方案二:
        // 1、查找到需要修改的cookie对象
        Cookie cookie=CookieUtils.findCookie("key2",req.getCookies());
        if(cookie!=null){
            // 2、调用setValue()方法赋予新的Cookie值
            cookie.setValue("newValue2");
            // 3、调用resp.addCookie()通知客户端保存修改
            resp.addCookie(cookie);
        }
    }

5、Cookie的生命控制

Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
setMaxAge()
正数,表示在指定的秒数后过期
负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
零,表示马上删除 Cookie

protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie=new Cookie("defaultLife","defaultLife");
        cookie.setMaxAge(-1);//设置存活时间
        resp.addCookie(cookie);

    }

6、对于Cookie的删除

Cookie的删除也是通过设置Cookie的生命来实现的

protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、先找到你要删除的cookie对象
        Cookie cookie=CookieUtils.findCookie("key2",req.getCookies());
        if(cookie!=null){
            // 2、调用setMaxAge(0);
            cookie.setMaxAge(0);
            // 3、调用resp.addCookie(cookie);
            resp.addCookie(cookie);
            resp.getWriter().write("key2的Cookie已经被删除");
        }
    }

二、Session

1、什么是Session

1、Session 就一个接口(HttpSession)。
2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个 Session 会话。
4、Session 会话中,我们经常用来保存用户登录之后的信息。

2、Session和Cookie的区别

Session和Cookie都可以保存用户数据,但是Session是保存在服务端,Cookie是保存在客户的浏览器中
Session的实现需要依赖于Cookie,当服务端创建Session后,会返回一个JSESSIONID存到Cookie中,下次再请求时,请求头中携带的Cookie会将JSESSIONID一并带回到服务端,这样服务端就可以找到对应的Session对象。

3、 如何创建 Session 和获取(id 号,是否为新)

如何创建和获取 Session。它们的 API 是一样的。
request.getSession()
第一次调用是:创建 Session 会话
之后调用都是:获取前面创建好的 Session 会话对象。
isNew(); 判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
getId() 得到 Session 的会话 id 值。

protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建和获取session对象
        HttpSession session = req.getSession();
        //判断session是否是新的
        boolean isNew = session.isNew();
        //获取session的唯一标识
        String id = session.getId();

        resp.getWriter().write("得到的session,它的id="+id+"<br>");
        resp.getWriter().write("这个session是否是新创建的: "+isNew);
    }

4、往Session域中存入和取出数据

protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getSession().setAttribute("key1","value1");
        resp.getWriter().write("已经往session中保存了数据");
    }
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object key1 = req.getSession().getAttribute("key1");
        resp.getWriter().write("从session中获取到的key1的数据是:"+key1);
    }

5、ession 生命周期控制

public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session
就会被销毁。
值为正数的时候,设定 Session 的超时时长。
负数表示永不超时(极少使用)
public int getMaxInactiveInterval()获取 Session 的超时时间
public void invalidate() 让当前 Session 会话马上超时无效。
Session 默认的超时时长是多少!
Session 默认的超时时间长为 30 分钟。
因为在 Tomcat 服务器的配置文件 web.xml中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session
超时配置默认时长为:30 分钟。

<session-config>
<session-timeout>30</session-timeout>
</session-config>

如果你想只修改个别 Session 的超时时长。就可以使用上面的 API。setMaxInactiveInterval(int interval)来进行单独的设
置。
session.setMaxInactiveInterval(int interval)单独设置超时时长。

protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getSession().setMaxInactiveInterval(3);
        resp.getWriter().write("三秒的session会话已经创建");
    }

使当前会话超时

protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.invalidate();
        resp.getWriter().write("session已经设置为超时");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值