cookie和session

Cookie

Cookie 是服务器通知客户端保存键值对的一种技术

客户端

有了Cookie后,每次请求都发送给服务器

每个Cookie的大小不能超过4kb

1.什么是cookie?

​ cookie是客户端保存数据的一种技术,而且保存的方式是键值对形式

2.如何去创建cookie,在客户端保存数据

​ cookie这个对象是servlet的jar包给我们提供的,我们只需要去创建cookie,并且通知浏览器保存cookie就可了

创建cookie对象

Cookie cookie = new Cookie("key","value");

通知浏览器保存cookie

response.addCookie(cookie);

3.cookie的生命周期

​ cookie默认的生命周期是一个session级别的,是浏览器的开启到关闭

服务器获取Cookie

​ 获取cookie方法

request.getCookies()

package com.os467.cookie;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieDemo01 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        addCookie(request,response);
        getCookies(request,response);

        getCookieFilter(request,response);
    }

    /**
     * 向客户端添加cookie
     * @param request
     * @param response
     */
    public void addCookie(HttpServletRequest request,HttpServletResponse response){

        //创建cookie对象
        Cookie cookie1 = new Cookie("username","tom");
        Cookie cookie2 = new Cookie("password","123");
        Cookie cookie3 = new Cookie("address","beijing");
        Cookie cookie4 = new Cookie("idCard","123124325");


        //通知浏览器保存cookie
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        response.addCookie(cookie3);
        response.addCookie(cookie4);

    }


    /**
     * 获取单个cookie的方式,只能通过遍历cookie数组,然后进行过滤
     * @param request
     * @param response
     */
    public void getCookieFilter(HttpServletRequest request,HttpServletResponse response){

        //根据请求对象获取客户端的cookie
        Cookie[] cookies = request.getCookies();

        //遍历cookie数组
        for (Cookie cookie : cookies) {

            if(cookie.getName().equals("username")){

                //设置响应对象支持html文本
                response.setContentType("text/html;charset=utf-8");

                //cookie.getName()获取cookie的key
                //cookie.getValue()获取cookie的value
                try {
                    response.getWriter().print(cookie.getName()+" "+cookie.getValue()+"<br>");
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }

    }


    /**
     * 获取浏览器端所有的cookie
     *
     * 获取cookie没有提供获取单个cookie的方法,只能获取所有然后再筛选出需要的cookie
     * @param request
     * @param response
     */
    public void getCookies(HttpServletRequest request,HttpServletResponse response){

        //根据请求对象获取客户端的cookie
        Cookie[] cookies = request.getCookies();

        //遍历cookie数组
        for (Cookie cookie : cookies) {

            //设置响应对象支持html文本
            response.setContentType("text/html;charset=utf-8");

            //cookie.getName()获取cookie的key
            //cookie.getValue()获取cookie的value
            try {
                response.getWriter().print(cookie.getName()+" "+cookie.getValue()+"<br>");
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

}

Cookie值的修改

方案一

1.先创建一个要修改的同名Cookie对象

2.再构造器,同时赋予新的Cookie值

3.调用response.addCookie(Cookie)

方案二

1.先查找到需要修改的Cookie对象

2.调用setValue()方法赋予新的Cookie值

3.调用response.addCookie()通知客户端保存修改

/**
 * 修改对象的cookie值
 * @param request
 * @param response
 */
public void setCookie(HttpServletRequest request,HttpServletResponse response){

    //把username的值改成jack
    Cookie cookie1 = new Cookie("username", "jack");

    //通知浏览器保存cookie
    response.addCookie(cookie1);

    //将密码改成654321

    //先获取浏览器所有的cookie
    Cookie[] cookies = request.getCookies();

    Cookie c = null;

    //遍历cookie
    for (Cookie cookie : cookies) {

        if (cookie.getName().equals("password")){

            cookie.setValue("654321");

            c = cookie;

        }

    }

    //通知浏览器保存cookie
    response.addCookie(c);

}

封装Cookie工具类

Cookie类无法获取浏览器端单个cookie,每次需要去遍历,因此我们选择把对cookie的操作封装成一个工具类

package com.os467.utils;

import javax.servlet.http.Cookie;

/**
 *根据cookie的key来找到某一个具体的cookie,因为api中我们只能获取所有cookie
 * 获取单个cookie的话只能通过标识去过滤,这样就很麻烦,所以我们可以封装一个工具类
 * 来提高开发速率
 */
public class FindCookieUtils {

    //构造方法私有化
    private FindCookieUtils(){

    }

    /**
     * 根据key来获取cookie
     * @return
     */
    public static Cookie findCookie(Cookie[] cookies,String name){

        if (cookies == null || cookies.length == 0 || name == null){

            return null;

        }

        //遍历cookie数组
        for (Cookie cookie : cookies) {

            if (cookie.getName().equals(name)){

                return cookie;

            }

        }

        return null;


    }


}

Cookie的生命周期

cookie默认的生命周期是一个session级别的,是浏览器的开启到关闭

Cookie生命控制

setMaxAge()

正数,表示在指定的秒数后过期

负数,表示浏览器一关,Cookie就会被删除(默认值是-1)

零,表示马上删除Cookie

设置cookie的生命周期

/**
 * 设置cookie的生命周期
 * @param request
 * @param response
 */
public void setMaxAgeCookie(HttpServletRequest request,HttpServletResponse response){

    //1.将所有的cookie的生命周期设置为一年
    for (Cookie cookie : request.getCookies()) {

        cookie.setMaxAge(60 * 60 * 24 * 365);

        //通知浏览器保存cookie
        response.addCookie(cookie);

    }

    //将密码所对应的cookie的生命周期改为一周
    Cookie cookie = FindCookieUtils.findCookie(request.getCookies(), "password");

    //修改生命周期
    cookie.setMaxAge(60 * 60 * 24 * 7);

    //通知浏览器保存
    response.addCookie(cookie);

}

删除一个具体的cookie

/**
 * 删除一个具体的cookie
 * @param request
 * @param response
 */
public void deleteCookie(HttpServletRequest request,HttpServletResponse response) {

    //删除idCard所对应的cookie
    Cookie cookie = FindCookieUtils.findCookie(request.getCookies(), "idCard");

    cookie.setMaxAge(0);

    //通知浏览器保存cookie

    response.addCookie(cookie);

}

Session

Session是一个接口(HttpSession)

Session就是会话,它是用来维护一个客户端和服务器之间关联的一种技术

每个客户端都有自己的一个Session会话

Session会话中,我们经常用来保存用户登录之后的信息

session是在服务端保存数据的一种技术,而且session可以关联客户端和服务端

session跟cookie是有关系的

以后会用session来保存用户登录之后的用户信息,我们之前所完成的登录功能是不完整的

前端校验会话中是否有用户数据,如果有,才能登录成功

如何去创建session对象?

创建session对象,需要用到request对象

HttpSession session = request.getSession()

session也可以说是一个域对象,可以存取值,取值范围,是浏览器的开启到关闭

request.getSession()第一次调用是:创建Session会话

isNew()判断到底是不是刚创建出来的

getId()得到Session的会话id值

session对象是一个单例的对象

Session域数据的存取

//存数据
request.getSession().setAttribute("key","value");

//取数据
request.getSession().getAttribute("key");

Session生命周期

Session生命周期控制

public void setMaxInactiveInterval(int interval)

设置Session的超时时间,超过指定的时长,Session就会被销毁

值为正数的时候,设定Session的超时时长,负数表示永不超时

getMaxInactiveInterval()获取Session的超时时间

invalidate()让当前Session会话马上超时无效

session默认超时时间是30分钟

设置生命周期与cookie区别:

负数,cookie代表浏览器关闭则删除,session代表永不超时

删除cookie可以设置0,删除session不可以,需要用指定的方法

设置session的超时时间

设置session的超时时间

session.setMaxInactiveInterval(3600 * 24);

通过配置文件设置默认超时时间

xml中配置是按照分钟配置的

<!--配置默认的超时时间-->
<session-config>
    <session-timeout>45</session-timeout>
</session-config>

让当前的session立即超时无效

这个方法在以后做注销的时候会用到

session.invalidate();
public class SessionDemo01 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");

        //创建session对象
        HttpSession session = request.getSession();
        HttpSession session2 = request.getSession();

        /*session.setMaxInactiveInterval(3600 * 24);*/


        response.getWriter().print("session是否是新创建的:"+session.isNew()+"<br>");

        response.getWriter().print("session的会话id值为:"+session.getId()+"<br>");

        response.getWriter().print("session对象是否是单例的:"+ (session == session2)+"<br>");

        //往session域中存数据
        session.setAttribute("key1","value1");
        session.setAttribute("key2","value2");

        //取出session中的数据
        response.getWriter().print("取出session中key1的数据"+session.getAttribute("key1")+"<br>");

        response.getWriter().print("取出session中key2的数据"+session.getAttribute("key2")+"<br>");

        //获取session超时时间
        response.getWriter().print("session默认超时时间"+session.getMaxInactiveInterval()+"<br>");

    }
}

session和cookie的关系和区别

session和cookie的关系

cookie保存数据的原理就是通过http协议响应头的方式把数据传递过去

在浏览器访问服务端的时候,假设我们并没有手动的去创建session对象,但是我们在响应头会发现一个现象:会有一个set-cookie : JESSIONID = 74045E2CC5F9FA30EE9CEBE1D092E1CD

JSEEIONID = session的会话id

所以说要想获得会话id,就必须得有session对象

总结:浏览器访问服务端的时候,会自动的去创建session会话id,自动生成会话id,然后在底层通过创建cookie对象的方式将会话id保存下来

Cookie cookie = new Cookie("JESSIONID",session的会话id)

session和cookie的区别

cookie

​ cookie是客户端保存数据的技术:只能去存放一些最基本的字符串,json串,不能存放java对象

​ cookie相对来说不安全,因为数据存在浏览器的内存里面,所以可以通过一些途径来获取到这些数据

session

​ session是服务端保存数据的技术,可以存放的数据类型有很多,String、List、Map、java对象

​ session相对来说是安全的,但是会占用服务器的资源,cookie是不会占用服务器资源的


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1300452403@qq.com

文章标题:cookie和session

字数:2.3k

本文作者:Os467

发布时间:2022-07-06, 18:27:45

最后更新:2022-09-05, 00:07:55

原始链接:https://os467.github.io/2022/07/06/cookie%E5%92%8Csession/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏