Cookie和Session

目录

一、什么是 Cookie?

二、如何创建Cookie?        

三、获取 Cookie

四、修改 Cookie 的值 

五、设置 Cookie 的存活时间 

六、设置Cookie的路径

七、Cookie 免用户名登录

八、什么是 Session ?

九、如何创建 Session 和 获取 Session ?

十、往 Session 域中的存 和 取

十一、Session 的生命周期控制

十二、 Session 和 浏览器 的技术关系


一、什么是 Cookie?

1 Cookie 是服务器通知客户端保存键值对的一种技术。
2 、客户端有了 Cookie 后,每次请求都发送给服务器。
3、每个 Cookie 的大小不能超过 4kb

二、如何创建Cookie?        

        // 创建Cookie 对象
        Cookie cookie = new Cookie("key1","value1");
        // 通知浏览器 创建 cookie 。这一步千万不能省、。
        response.addCookie( cookie );

 按F12可查看 Cookie

 Cookie 是通过 响应头  中的 Set-Cookie 中创建的。所以 最后一步:response.addCookie 是千万不能少的,少了会创建不成功。

 

 也可一次创建多个 Cookie,创建一个 addCookie 一次。、

 三、获取 Cookie

        // 获取 Cookies,返回一个数组
        Cookie[] cookies = request.getCookies();

 如果想要得到某个 cookie 是没有匹配的方法的,需要将 cookies 数组进行遍历,然后进行判断。

在开发中使用的时候,一般是将 查找 cookie 的方法 封装一个工具类:

public class CookieUtils {
    /**
     * 
     * @param name 查找 cookie 的名字
     * @param cookies cookie数组
     * @return
     */
    public static Cookie findCookies(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 ;
    }
}

四、修改 Cookie 的值 

Cookie底层其实就是 map,第一种方案就是:key 重复,覆盖 value

  //修改 Cookie 值
    protected void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 第一种方案:
        //获取 cookie 对象
        Cookie  cookie = new Cookie("key1","newValue1");
        // 增加 到浏览器中。覆盖原来 名字为 key1的 value
        response.addCookie(cookie);

        // 第二种方案:
        //查找到某个 cookie
        Cookie cookie1 = CookieUtils.findCookies("key2", request.getCookies());
        if (cookie1 != null){
            //对 value 进行修改
            cookie1.setValue("newValue2");
            //增加到浏览器中
            response.addCookie(cookie1);
        }
        response.getWriter().write("cookie 值已经修改好");

    }

对于要修改的值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at 符号、冒号和分号。空值在所有浏览器上的行为不一定相同。

五、设置 Cookie 的存活时间 

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

 // 当 MaxAge 是负数时
    protected void cookie_life (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("key3","value3");
        cookie.setMaxAge(-1); // 设置 -1  浏览器一关闭就会删除,默认就是-1.
        response.addCookie(cookie);

    }
    //当 MaxAge 是 0 时
    protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Cookie cookie = CookieUtils.findCookies("key1", request.getCookies());
        if (cookie != null) {
            cookie.setMaxAge(0); //设置0 立马删除
            response.addCookie(cookie);
            response.getWriter().write("key1已经被删除");
        }
    }

    protected void cookie_life_3600(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = CookieUtils.findCookies("key2", request.getCookies());
        if (cookie != null){
            // 设置 指定的存活时间。
            cookie.setMaxAge(60*60);
            response.addCookie(cookie);
            response.getWriter().write("将 key2 的生存周期设置为 3600 s");
        }
    }

六、设置Cookie的路径

Cookie path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。
path 属性是通过请求的地址来进行有效的过滤。 只要请求地址符合哪个 cookie的路径 就发送哪个cookie。
CookieA
        path=/工程路径
CookieB
        path=/工程路径 /abc
假设请求地址如下:
        http://ip:port/工程路径 /a.html
                CookieA 发送
                CookieB 不发送
        http://ip:port/工程路径 /abc/a.html
                CookieA 发送
                CookieB 发送

    protected void cookie_path(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建cookie对象
        Cookie cookie = new Cookie("key4","value4");
        // 设置 cookie 的路径,只有符合这个路径才能获取到 cookie
        cookie.setPath(request.getContextPath() + "/a"); //设置cookie 的路径为:/工程路径/a
        response.addCookie(cookie);
    }

 在 谷歌 浏览器中,如果你的请求地址不符合 cookie 的路径,为了安全考虑 他是不会给你显示 cookie 的。

不符合 Cookie路径:

符合 Cookie 路径: 

 七、Cookie 免用户名登录

当用户第一次访问时,输入用户名密码,第二访问不需要输入用户名,自动给你获取了。就是免用户名登录 

 login.jsp 页面:

 LoginServlet :登录成功后,将用户名保存到 cookie 中,登录失败是不会保存的。

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("admin".equals(username) && "admin".equals(password)){
            //登录成功后,将用户名保存到 cookie 中
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge( 60 * 60 * 24 * 7); //用户名保留七天
            response.addCookie(cookie);
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }
    }
}

 当你第二次访问登录界面时,用户名就会自动从 cookie中获取。

八、什么是 Session ?

1、Session 是一个接口(HttpSession)。

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

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

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

5、Cookie 是保存在 浏览器中,Session 是保存在 服务器中。

九、如何创建 Session 和 获取 Session ?

创建 和 获取 都是一样的:

        request.getSession()

第一次调用是:创建 Session 会话

之后调用都是:获取前面创建好的 Session 会话对象。

session.isNew(); 判断到底是不是刚创建出来的(新的)

        true 表示刚创建

        false 表示获取之前创建

每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。

 session.getId()  得到 Session 的会话 id 值。

public class SessionServlet extends BaseServlet {

    protected void createAndGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 第一次:创建 session
        HttpSession session = request.getSession();
        // 判断 session 是否是新创建的
        boolean aNew = session.isNew();
        //获取 session 的 id
        String id = session.getId();

        response.getWriter().write("session 的 ID:"+id);
        response.getWriter().write("session 是否是新创建的:"+ aNew);
    }
}

十、往 Session 域中的存 和 取

和之前学的 session域存放数据一样。

        // session 域中存数据
        request.getSession().setAttribute("key1","value1");
        //从 session 域中取出数据
        Object key1 = request.getSession().getAttribute("key1");

十一、Session 的生命周期控制

public void setMaxInactiveInterval(int interval)    设置 Session 的超时时间(以秒为单位),超过指定的时长, Session 就会被销毁。
        值为正数的时候,设定 Session 的超时时长。
        负数表示永不超时(极少使用)
public int getMaxInactiveInterval()     获取 Session 的超时时间
public void invalidate()         让当前 Session 会话马上超时无效
session 默认的生存周期:30 min 
session默认的生存周期。是由Tomcat配置文件配置好的。
CATALINA_BASE下的 /conf/web.xml 文件:

设置 session 生存周期的俩种方法:

1、配置工程下的 web.xml 文件:

使 本工程 下的所有 session 的声明周期都设置为 20 min

    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>

 2、使用 setMaxInactiveInterval(int interval)  方法

使用这个方法只能设置单独的 session 生命周期。

   protected void setMaxInactiveInterval(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(3);

        response.getWriter().write("将 session 的生命周期设置为 3 s");
    }

Session 超时概念:只要不断的发送请求就永远不会超时,俩次请求之间的时长超过设置的时间就会超时 

 

十二、 Session 和 浏览器 的技术关系

Session 是用于 服务器端记录信息的,Cookie 是用于浏览器记录信息的。

如果浏览器有 Cookie 信息:每次发送请求都会把 Cookie 信息发送给服务器。

就是一串这样的信息:JSESSIONID=C4ABD831BD83E5FE59F621B8AEF6E4FA; 

服务器会根据这个 ID 找到 内存中的 session 并返回浏览器中。

如果浏览器没有 Cookie 信息:服务器会 重新创建出来一个 session对象,并发送给浏览器。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鲨瓜2号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值