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的概念及使用_第1张图片

Cookie保存的sessionId

Cookie的概念及使用_第2张图片

四、使用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的概念及使用_第3张图片

思路如下:

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

Cookie的概念及使用_第4张图片 

login.jsp示例(登录页面)

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

用户名:

密码:

记住我

 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;
            }
        }



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

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可以。

     

你可能感兴趣的:(java,Web,数据编程,java,前端,服务器,html,tomcat)