Cookie的概念及使用

目录

前言

一、什么是Cookie?

二、Cookie的作用

三、Cookie的工作原理

四、使用Cookie存储数据

1.创建Cookie对象

Cookie的常用方法

2.将Cookie对象写入响应

3.从请求中读取Cookie数据

五、Cookie禁用后sessionId如何传递

URL重写技术

六、Cookie的应用——实现自动登录

七、Cookie和Session的区别

相同点

不同点

由于一系列原因: 没有将Cookie和session融入到一块讲,这里给大家一个session的链接:

 (1条消息) Session的生命周期_千小半的博客-CSDN博客

前言

    前面学习了session对象,服务器产生的sessionId会在响应的过程中返回到客户端保存,其实sessionId的是通过一个名为JSESSIONID的Cookie对象去保存然后发送给浏览器的。那么什么是Cookie呢?它又是如何存储数据的呢?

一、什么是Cookie?

      Cookie是由服务器端产生并发送给客户端浏览器的,浏览器会将发送过来的Cookie存储到某个文件中,随后再一次请求时,会自动带着存储的Cookie一并请求到服务器端(注意: Cookie虽然保存了sessionId,但它并不是JSP的内置对象,是需要实例化的)。

二、Cookie的作用

     负责客户端和服务器端的文本传递,最终文本保存在浏览器。

三、Cookie的工作原理

      浏览器发送第一次请求时,服务器会判断有没有Cookie,如果没有就创建Cookie,以名值对的形式将sessionId保存在Cookie中并响应,浏览器接收响应并把Cookie保存在客户端浏览器,当浏览器下一次发送请求时,request中会自动带着Cookie去发送到服务器端,服务器接收处理并再次响应。

Cookie保存的sessionId

四、使用Cookie存储数据

1.创建Cookie对象

 Cookie newCookie=new Cookie(String name,String value);

Cookie存储的数据类型是字符串

Cookie的常用方法

方法名称        说明
void setMaxAge(int expiry)

设置Cookie的有效期,以秒为单位

: 当expiry 参数大于0时,表示Cookie的有效期

: 当expiry 参数等于0时,表示客户端删除该Cookie

: 当expiry 参数小于0或者不设置时,表示Cookie关闭浏览器窗口后失效。

void setValue(String value)在Cookie创建后,对Cookie进行赋值
String getName()获取Cookie的名称
String getValue()获取Cookie的值
int getMaxAge()获取Cookie的有效时间,以秒为单位

2.将Cookie对象写入响应

response.addCookie(newCookie);

写入响应Cookie才能被浏览器保存

3.从请求中读取Cookie数据

  Cookie是使用name/value的形式保存的,它是一个数组,遍历数组时需要使用getName()方法来审查。

for (Cookie cookie : cookies) {
       if (cookie.getName().equals("userName")) {
                   //执行操作
            }
 }

五、Cookie禁用后sessionId如何传递

     sessionId是通过Cookie去响应到浏览器的,如果Cookie被禁用那么sessionId该如何传递呢?

URL重写技术

   原理: 在服务器中,通过重定向重写技术将sessionId拼接到url中一起响应到客户端。客户端收到响应,判定是否是重定向,再次使用上次的重写地址向服务器发送请求。

    方法

response.sendRedirect(reponse.encodeRediectURL("响应页面"))

必须使用重定向实现!!!

浏览器Cookie和重写技术一起使用浏览器Cookie优先生效!!!!

六、Cookie的应用——实现自动登录

    通过以下流程图来分析Cookie的实际应用。

  示例:   Cookie最典型的应用就是判定用户是否已经登录过,用户会得到是否记住密码,下次就可以直接访问,不用登录,那么Cookie怎么去实现自动登录呢。

思路如下:

      使用Cookie实现自动登录的前提是,第一次登录是必须勾选记住我,然后取出用户名和密码创建Cookie并将信息存入Cookie,最后响应到浏览器,在下次请求时,用户直接越过登录访问index首页时,判定request是否有Cookie,如果有就直接访问,没有就返回登录页面(session用来判定用户是否已经登录)。

 

login.jsp示例(登录页面)

      用户点击登录跳转到do_login验证登录页面(这里逻辑处理没有使用Servlet: JSP其实也可以啦)。

<form action="do_login.jsp" >
    用户名: <input type="text" name="userName" id="userName"> <br> <br>
    密码: <input type="password" name="passWord" id="passWord"> <br> <br>
     <input type="checkbox" name="remember" value="0">记住我
    <input type="submit" value="登录">
</form>

 do_login.jsp 示例(逻辑处理页面)

      request获取请求的数据,然后判断用户输入的用户名和密码是否匹配,匹配的话就判定复选框的是否为null,不为null的话说明用户已勾选记住我(创建Cookie的用户名和密码),(如果信息不匹配则返回登录页面),否setMaxAge设置Cookie的有效时长,随后响应到浏览器,别忘了在session中存入用户名,用来判断用户是否已经登录。验证成功后重定向到首页。

<%
    String userName = request.getParameter("userName");
    String password = request.getParameter("passWord");
    String remember = request.getParameter("remember");
    if ("admin".equals(userName) && "123".equals(password)) {
        if (remember != null) {
            //创建Cookie
            Cookie userNameCookie = new Cookie("userName", userName);
            Cookie passWordCookie = new Cookie("passWord", password);
            userNameCookie.setMaxAge(60 * 5);
            passWordCookie.setMaxAge(60 * 5);
            //响应Cookie到浏览器
            response.addCookie(userNameCookie);
            response.addCookie(passWordCookie);
        }
        session.setAttribute("userName", userName);
        response.sendRedirect("/index.jsp");
        return;
    }else
   {
        response.sendRedirect("/login.jsp");
   }
%>

 index.jsp 示例(首页)

   如果session没有数据==null,代表用户第一次访问,如果Cookie不为null说明用户是自动登录执行一系列操作,否则返回登录页面。

<%
    Object userName = session.getAttribute("userName");
    Cookie[] cookies = request.getCookies();
    if (userName == null) {
        //避免第一次请求时没有Cookie: 错误: session最终还是会创建
        if(cookies!=null)
        {
            String name = "";
            String pwd = "";
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("userName")) {
                    name = cookie.getValue();
                }
                if (cookie.getName().equals("passWord")) {
                    pwd = cookie.getValue();
                }
            }
            if (name.equals("admin") && pwd.equals("123")) {
                //登录成功,重定向到首页
                session.setAttribute("userName", name);

            } else {
                System.out.println(session.getId());
                //登录失败。重定向到登录页面
                response.sendRedirect("/login.jsp");
                return;
            }
        }



    }
%>
<div>用户名:<%=session.getAttribute("userName")%></div>

session数据保存的问题 

   一种情况: 用户第一次直接访问首页,Cookie实现自动登录后,此时session里是没有值的,因为session值的添加是在登录时添加的,所以需要在Cookie验证成功后添加session的值。

判定Cookie!=null的问题!!!

    我一开始觉得Cookie不判定也可以实现啊,但是不然,如果不判定Cookie!=null的话,页面会报空指针异常,虽然Cookie里是有sessionId的,但是第一次请求的时候他没有Cookie啊!!!!,服务器最终会创建一个Cookie,但是在这之前,Cookie是等于null的!!!

七、Cookie和Session的区别

相同点

  • 都可以保存数据
  • 都可以设置数据的有效时间

不同点

  • session数据是保存在服务器端的,而Cookie是保存在浏览器。
  • session存储的数据类型是object,Cookie只能存储字符串类型。
  • session会随着会话关闭,Cookie对象可以长时间保存在客户端。
  • 敏感数据不可以使用Cookie保存,session可以。

     

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引中提到,cookie和session是用于在浏览器和服务器之间传递信息的机制。Cookie是浏览器保存在用户计算机上的一小段文本数据,它包含了键值对结构的信息。每次用户访问一个网站时,浏览器都会将相应的Cookies发送给服务器,以便服务器可以根据这些数据进行一些操作。 引用中进一步解释了cookie的工作原理。每个域名/地址都有自己的Cookie,访问不同的网站会产生不同的CookieCookie的具体内容是由网站的开发人员自行约定的,外人无法知道其中键和值的具体内容。 引用中指出,Cookie中不仅包含了SessionId,还包含了其他一大段字符串。这些Cookie中的数据可以用于向服务器传递会话状态等信息。 Session是服务器端的一种机制,用于跟踪用户的会话状态。当用户首次访问一个网站时,服务器会为其创建一个唯一的SessionId,并将该SessionId存储在Cookie中发送给浏览器。浏览器在后续的请求中会携带该SessionId,服务器通过该SessionId可以识别用户并维护用户的会话状态。 所以,cookie是存储在浏览器中的一小段文本数据,用于在浏览器和服务器之间传递信息;而session是服务器端的一种机制,用于跟踪用户的会话状态。它们之间的区别在于存储位置、作用范围和安全性等方面。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [什么是cookie?什么是session?cookie与session有什么区别](https://blog.csdn.net/weixin_46407419/article/details/124855118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [网络原理之HTTP协议,及理解Cookie和Session的区别](https://blog.csdn.net/qq_41603622/article/details/118361838)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值