面试常问:Cookie和Session方法

(1)Servlet Cookies
①cookie的概念

定义: Cookies 是存储在客户端计算机上的文本文件,并保留了用户的各种跟踪信息
作用: 会话保持,如完成用户的登录与状态保持

② cookie工作原理
  • 客户端向服务区发起登录请求
  • 服务器脚本向浏览器发送一组 Cookies。例如:姓名、年龄或识别号码等。
  • 浏览器将这些信息存储在本地计算机上,以备将来使用。
  • 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别用户。

在这里插入图片描述

③cookie的构成

Cookies 通常设置在 HTTP 头信息中。设置 Cookie 的http请求,会向 Servlet 会发送如下的头信息:

HTTP/1.1 200 OK 
Date: Fri, 04 Feb 2000 21:03:38 GMT 
Server: Apache/1.3.9 
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; 
            path=/; domain=bit.com 
Connection: close 
Content-Type: text/html
  • Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域。名称和值会被 URL 编码。
  • expires 字段是一个指令,告诉浏览器在给定的时间和日期之后过期(“忘记”)该 Cookie。
  • 如果浏览器被配置为存储 Cookies,它将会保留此信息直到到期日期。

如果用户的浏览器指向任何匹配该 Cookie 的路径和域的页面,它会重新发送 Cookie 到服务器。浏览器的头信息可能如下所示:

GET / HTTP/1.0 
Connection: Keep-Alive 
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc) 
Host: zink.demon.co.uk:1126 
Accept: image/gif, */ 
Accept-Encoding: gzip 
Accept-Language: en 
Accept-Charset: iso-8859-1,*,utf-8 
Cookie: name=xyz

Servlet 就能够通过请求方法 request.getCookies() 访问 Cookie,该方法将返回一个 Cookie 对象的数组。

④Servlet 操作cookie方法

以下是在 Servlet 中操作 Cookies 时可使用的有用的方法列表:
在这里插入图片描述

④代码示例

(1)代码示例1-给客户端写入 Cookie:

web.xml文件中设置:

<servlet>
    <servlet-name>setck</servlet-name>
    <servlet-class>SetCookieServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>setck</servlet-name>
    <url-pattern>/setck</url-pattern>
  </servlet-mapping>

SetCookieServlet.java文件中:

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;
import java.io.PrintWriter;

public class SetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.设置两个基础的属性
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        // 2.给客户端写入 Cookie
        Cookie nameCookie = new Cookie("username","java");
        // 设置 cookie 的最大存活时间
        nameCookie.setMaxAge(60); // 最大存活时间 60s
        // 将 Cookie 信息写入到客户端(浏览器)
        response.addCookie(nameCookie);

        // 多个 Cookie 存储
        Cookie pwdCookie = new Cookie("password","root");
        pwdCookie.setMaxAge(-1); // 【此值如果是-1表示cookie“永”不过期】
        response.addCookie(pwdCookie);

        PrintWriter writer = response.getWriter();
        writer.println("<h1>Cookie 写入成功~</h1>");
    }
}

运行截图:
在这里插入图片描述(1)代码示例2-得到客户端写入 Cookie:

web.xml文件中设置:

<servlet>
    <servlet-name>getck</servlet-name>
    <servlet-class>GetCookieServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>getck</servlet-name>
    <url-pattern>/getck</url-pattern>
  </servlet-mapping>

GetCookieServlet.java文件中:

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;
import java.io.PrintWriter;

public class GetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        // cookie 的读取
        Cookie[] cookies = request.getCookies();
        PrintWriter writer = response.getWriter();
        for(Cookie cookie:cookies){
            writer.println(String.format("<h1>Cookie Name:%s -> Cookie Value:%s</h1><p></p>",
                    cookie.getName(),cookie.getValue()));
        }
    }
}

运行截图:
在这里插入图片描述

⑤Cookie的缺点

因为Cookie是存储在浏览器端的,所以Cookie有可能被篡改和伪造。
在这里插入图片描述

(2) Servlet Session
①session 的概念
  • 定义: session 是存储在服务器上的文本文件,并保留了用户的各种跟踪信息
  • 作用: 会话保持,如完成用户的登录与状态保持,因为在服务器端,所以相对安全一些。
②session 工作原理

在这里插入图片描述

③Servlet 操作session方法

HttpSession 对象

  • Servlet 还提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
  • Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。
  • 我们可以通过调用 HttpServletRequest 的公共方法getSession() 来获取HttpSession 对象,如下所示:
    HttpSession session = request.getSession();
  • 需要在向客户端发送任何文档内容之前调用 request.getSession()

下面总结了 HttpSession 对象中可用的几个重要的方法:
在这里插入图片描述

④代码示例

本实例说明了如何使用 HttpSession 对象获取 session 会话创建时间最后访问时间。如果不存在session 会话,我们将通过请求创建一个新的 session 会话,并记录访问的次数。

web.xml文件中设置:

<servlet>
  <servlet-name>session</servlet-name>
  <servlet-class>MySessionServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>session</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>

MySessionServlet.java文件中:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class MySessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();

        // 操作 Session,尝试从客户端获取一个 session,如果获取
        // 失败,这新创建一个session信息
        HttpSession session = request.getSession();

        String sessionId = session.getId();
        writer.println("<h1>欢迎访问~</h1>");
        writer.println(String.format("<h3>SessionID:%s</h3>",
                sessionId));
        writer.println("<hr>"); // 输出分隔线

        // 打印 Session 的创建时间
        writer.println("Session 创建时间:"+
                new Date(session.getCreationTime()));

        // 打印 Session 的最后访问时间
        writer.println(String.format("<p></p>Session 最后访问时间:%s<p></p>",
                new Date(session.getLastAccessedTime())));

        // 会话 key 值定义
        String sessionKey = "countkey";
        // 判断当前会话信息session是否为新的会话信息
        if(session.isNew() ||
                session.getAttribute(sessionKey)==null){
            // 表示第一次使用 session 对象
            session.setAttribute(sessionKey,1);
            writer.println("访问次数:1");
        }else{
            // 非第一次访问
            int count =(int)session.getAttribute(sessionKey);
            count++;
            // 更新 session 信息
            session.setAttribute(sessionKey,count);
            writer.println("访问次数:"+count);
        }
    }
}

运行结果截图:
在这里插入图片描述在这里插入图片描述

(3)面试题:Session 和 Cookie的区别是啥?
  • 1.Cookie 不安全 、Session 是安全的
  • 2.Cookie 是存储在浏览器端的; Session是存储在服务器端的;
  • 3.Cookie 是有大小限制的(4K),Session是没有大小限制的。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秃头小宝儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值