基于Cookie与Session的Servlet API会话管理操作

目录
  • ️前面的话️
  • 1.Cookie与Session
    • 1.1回顾与理解Cookie与Session
    • 1.2Servlet会话管理操作
  • 2.常见案例实现
    • 2.1登录逻辑的实现
    • 2.2上传文件

️前面的话️

本篇文章将介绍Servlet中的会话管理操作,前面在介绍HTTP的时候,我们已经说了Cookie与Session的基本原理,Cookie相当于就诊卡,就诊卡一刷得到的信息就相当于Session,Servlet对Cookie与Session有着很好的支持,可以实现会话的管理操作。

1.Cookie与Session

1.1回顾与理解Cookie与Session

通过学习HTTP,我们知道HTTP协议是“无状态”协议,这里的“无状态”指的是默认情况下 HTTP 协议的客户端和服务器之间的当次通信, 和下次通信之间没有直接的联系,但是在实际开发中是需要建立起来联系的,比如一个网站的登录,在生活中,我们登录一次网站后,再退出网站后,再次登录网站,我们会发现并不需要再次输入账号密码登录,网站会自动地帮助我们登录。

为了实现类似这种网站的自动登录,在用户第一次输入账号密码登录的时候,服务器会创建一个Session会话来保存当前用户的数据和信息,和生成一个Cookie,Cookie里面含有该Session里面的一些关键身份信息,服务器会将这个Cookie作为响应给客户端,客户端或者说是浏览器就会将这个Cookie储存起来,当下一次登录时,浏览器发送请求的时候就会带上这个Cookie,服务器收到请求后会去获取请求中的Cookie列表,并去查询服务器中是否存在对应的Session,如果存在就会自动登录,不用用户输入账号与密码,否则需要用户输入账号密码进行登录。

打个比方来说,去医院看病需要先挂号,如果你没有当前医院的就诊卡,就会为你新办理一个就诊卡,这个就诊卡里面含有你的一些关键身份信息,并且会在医院的服务器上新建一个档案,得到这个就诊卡,你就可以在该医院的各个科室进行刷卡,如果你之前在这个医院有就诊记录,你一刷卡就可以查询到你所有在当前医院的就诊信息。 上面的这个就诊卡就相当于这里的Cookie,上面有你最基本的身份信息,在医院服务器上所储存有关你的详细信息,就相当于一个会话,也就是一个Session,当然服务器上不止你一个人的Session,它包含很多用户的信息。

这个Cookie与Session机制最主要的作用就是用来识别用户的身份信息。

1.2Servlet会话管理操作

HttpServletRequest类中,可以使用getSession来获取或创建会话与getCookies可以获取请求中的Cookie列表。

方法 描述
HttpSession getSession() 在服务器中获取会话. 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null
Cookie[] getCookies() 返回一个数组, 包含客户端发送该请求的所有的 Cookie 对象. 会自动把Cookie 中的格式解析成键值对.

对于getCookies方法,由于Cookie能够任意自定义键值对,如果想要获取一般的键值对,可以使用该方法获取,但是如果想要获取特殊的键值对,如SessionId,可以通过getSession直接获取,没必要通过getCookies方法的途径来获取,因为getSession方法它自动帮助我们获取了SessionId

调用getSession方法所做的事情:

创建会话:

  • 第一步,获取cookie里面的sessionId字段,相当于会话标识。
  • 第二步,判断是否在服务器上存在。
  • 第三步,如果不存在,则创建一个新的HttpSession对象,并生成一个新的sessionId
  • 第四步,接下来就会以新生成的sessionId作为key,生成的HttpSession对象作为value,以键值对形式储存到类似与哈希表的结构中。
  • 第五步,返回响应,将sessionId通过set-Cookie字段返回给浏览器,这样浏览器就得到了sessionId,浏览器就可以将SessionId保存到Cookie中了。

获取会话:

  • 第一步,获取cookie里面的sessionId字段,相当于会话标识。
  • 第二步,判断是否在服务器上存在。
  • 第三步,直接查询HttpServlet对象,找到直接作为响应返回给客户端。

关于HttpSession 这个对象本质上也是一个键值对的形式,并且允许程序员在对象中储存任意的键值对数据,但是key必须是String, value随意。

HttpSession里面的每一个键值对称为属性(Attribute),该类中提供了两个方法可以用来获取该对象中的属性和储存属性(键值对)。

方法 描述
Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null.
void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话
boolean isNew() 判定当前是否是新创建出的会话

Cookie类常用方法 Cookie对象包含了两个属性,一个是name,另一个是value,而在请求中是以键值对的形式储存的,服务器收到请求后会将键值对形式的cookie转换为Cookie对象。

方法 描述
String getName() 该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是 Set-Cooke 字段设置给浏览器的)
String getValue() 该方法获取与 cookie 关联的值
void setValue(String newValue) 该方法设置与 cookie 关联的值。

在响应中添加Cookie 我们可以通过HttpServletResponse类中的addCookie方法来在响应中添加Cookie,它会作为HTTP响应中set-Cookie字段来进行表示。

方法 描述
void addCookie(Cookie cookie) 把指定的 cookie 添加到响应中.

2.常见案例实现

首先我们先得创建Maven文件,引入依赖,创建必要的路径,这些过程在之前介绍Servlet使用已经详细介绍了,这里就不再进行赘述了,我们的重点是前端与后端交互过程的实现。

2.1登录逻辑的实现

我们经常上网查询一些网站什么的,很多网站都会让你先登录,才能使用其中的一些功能,登录完成之后,一般都会跳到一个主页网站,下面我们就来简单地实现一下这一套逻辑。

第一步,约定前后端接口。 我们需要实现两套交互逻辑,一是登录跳转,二是获取主页。 登录跳转约定: 约定使用POST请求,响应采用302重定向。

获取主页约定: 采用GET请求,响应返回一个页面。

第二步,编写前端交互页面 我们的重点是来学习登录的逻辑,因此登录的界面不需要很好看很复杂,只要能够有两个输入框和一个提交按钮让我们输入账号密码就行。目标页面如下:

前面我们约定了登录的跳转采用post请求,由于场景很简单,我们直接使用form表单构造post请求就可以了。

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <form action="login" method="post">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit" value="登录">
    </form>
</body>
</html>

其中input标签的name属性就对应键值对的key,输入的内容就对应键值对的value

第三步,编写后端处理代码

对于登录跳转页面post请求处理思路如下:

  • 从请求中获取账号与密码。
  • 验证账号与密码。
  • 如果验证通过,创建会话,并将username数据加入到会话中,当然还可以加入其它的属性,比如主页被访问的次数,创建好会话后,重定向到主页index
  • 如果验证不通过,告知登录失败即可。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setCharacterEncoding("utf8");
        //获取用户账号
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //验证账户
        //验证按照正常流程应该从数据库读数据,但是为了便于演示登录的逻辑,我们直接将账号密码写死
        //假设正确的账号与密码是 zhangsan 123
        if ("zhangsan".equals(username) && "123".equals(password)) {
            //登录成功
            //创建会话,为后续需登录的页面做准备
            HttpSession httpSession = req.getSession(true);
            httpSession.setAttribute("username", username);
            //初始情况下设置登录次数
            httpSession.setAttribute("count", 0);
            //跳转到目标页面index
            resp.sendRedirect("index");
        } else {
            //登录失败
            resp.getWriter().write("登录失败!");
        }
    }
}

获取主页的get请求处理思路:

  • 获取会话。
  • 取出会话信息,将主页返回次数加1并写回到会话信息中。
  • 返回一个简单的页面。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //返回一个主页
        //获取会话,参数必须是false
        HttpSession httpSession = req.getSession(false);
        //取出会话信息
        String username = (String) httpSession.getAttribute("username");
        Integer cnt = (Integer) httpSession.getAttribute("count");
        //访问次数加1
        cnt++;
        //写回到会话中
        httpSession.setAttribute("count", cnt);
        //构造页面。我们简单构造一下就好
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("<h4>欢迎您!" + username + "</h4> <h4>这个主页已经被访问了" + cnt + "次</h4>");
    }
}

抓包结果:

第一次交互,浏览器从服务器上拿到登录页面。 第二次交互,浏览器给服务器一个登录请求,服务器返回响应,重定向页面。 第三次交互,浏览器收到302重定向响应后,再次向服务器发起请求,访问主页。

效果演示:

2.2上传文件

上传文件时,前端需要使用到form表单,表单中需要使用一种特殊的类型,叫做form-data类型。

提交文件的时候,浏览器会把文件以form-data的格式构造到Http请求中,服务器可以通过getPart方法来取的Part对象(文件),再通过Part对象就能够获取到文件信息了。

方法 描述
Part getPart(String name) 获取请求中给定 name 的文件
Collection getParts() 获取所有的文件

Part类常用方法:

方法 描述
String getSubmittedFileName() 获取提交的文件名
String getContentType() 获取提交的文件类型
long getSize() 获取文件的大小
void write(String path) 把提交的文件数据写入磁盘文件

上传文件的请求采用post请求,使用form表单构造post请求,我们来实现将一个文件上传到本机的一个目录下。

前端交互页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>file</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile">
        <input type="submit" value="提交">
    </form>
</body>
</html>

后端处理代码:

基本实现思路:

  • 从请求中获取Part对象。
  • 调用Part对象的一些方法,获取文件信息,在磁盘写文件等。
  • 返回响应。
  • 加上@MultipartConfig注解,不然会出错。
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Part对象
        Part part = req.getPart("myfile");
        //输出文件信息
        //文件名
        System.out.println("文件名:" + part.getSubmittedFileName());
        //文件类型
        System.out.println("文件类型:" + part.getContentType());
        //文件大小
        System.out.println("文件大小:" + part.getSize());
        //将文件写入磁盘
        part.write("D:\\gtee\\Java代码\\github\\Login\\src\\main\\webapp\\上传.png");
        //返回响应
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("上传成功!");
    }
}

效果演示:

看看我们的目标目录上有没有上传的图片。

发现我们上传的文件已经拷贝到我们所写的磁盘位置上了,我们上传的文件会储存在响应的body部分,在这个body中,会使用一段随机的字符串作为标志,表示文件的开始与结束。

以上就是基于Cookie与Session的Servlet API会话管理操作的详细内容,更多关于Servlet API会话管理的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringBoot详细讲解异步任务如何获取HttpServletRequest

    目录 原因分析 解决方案 前置条件 pom配置 requrest共享 自定义request过滤器 自定义任务执行器 调用示例 原因分析 @Anysc注解会开启一个新的线程,主线程的Request和子线程是不共享的,所以获取为null 在使用springboot的自定带的线程共享后,代码如下,Request不为null,但是偶发的其中body/head/urlparam内容出现获取不到的情况,是因为异步任务在未执行完毕的情况下,主线程已经返回,拷贝共享的Request对象数据被清空 Servlet

  • 详解Struts2中Action访问Servlet API的几种方法

    详解Struts2中Action访问Servlet API的几种方法 在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象.如果想在Struts2程序中用到这两个对象,也有解决方法 Struts2的Action并未直接与任何Servlet API耦合,这是Struts2的一个改良之处,因为Action类不再与Servlet API耦合,能更轻松的测试该Action.但如何访问? Web应

  • SpringBoot项目找不到javax.servlet.Filter的问题及解决

    目录 SpringBoot找不到javax.servlet.Filter的问题 启动SpringBoot项目找不到报错 这是我配置的(有问题的) 正确的配置(在远程maven仓库中搜索的配置) SpringBoot找不到javax.servlet.Filter的问题 新创建一个SpringBoot项目,编译时出现了找不到javax.servlet.Filter的异常. 这个类位于tomcat-embed这个jar下面,这里的解决方法并不是像网上大部分所说的手动添加这个jar,因为这是由于没有添加

  • Servlet连接数据库实现用户登录的实现示例

    目录 一.需求: 二.先复习一下JDBC 1.概述: 2.开发步骤: 三.代码实现: 1.登录界面代码: 2.登录成功界面: 3.servlet代码: 4.数据库数据 5.登录成功页面: 6.登录失败界面: 7.登录界面: 做一个小案例顺便复习一下jdbc的知识 一.需求: 用户在浏览器输入用户名和密码,如果数据库中有数据,提醒用户登录成功,如果没有数据,提醒用户重新登录 二.先复习一下JDBC 今天用的时候有些细节忘了,知识还是需要多次复习啊,并不是说学过就是自己的. 1.概述: 用java程

  • JavaWeb之Servlet注册页面的实现示例

    Servlet-注册页面 环境准备: 本文所用到环境如下: 软件:Eclipse(2018) 服务器:Tomcat 9 在index.jsp添加相关的代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 T

  • 浅谈Servlet的Cookie和Session机制

    一.Servlet Cookies Cookies定义:Cookies是存储在客户端计算机上的文本文件,并保留了用户的各种跟踪信息. Cookies作用:会话保持,如完成用户的登录与状态保持 Cookies的工作原理: 客户端向服务区发起登录请求 服务器脚本(代码)向浏览器发送一组Cookies,例如:姓名,年龄等 浏览器将这些信息存储在本地计算机上,以备将来使用 当下一次浏览器向web服务器发送任何请求时.浏览器会把这些Cookies信息发送到服务器,服务器将使用这些信息来识别账户 1.1 C

  • Action访问Servlet的API的简单实例

    Action访问Servlet的API_,主要访问如下: 1.>获取request对象 2.>获取请求参数 3.>获取response对象,可用于传递cookie 3.>获取作用域对象,request,Session,application,并设置共享数据, 访问方式一: 通过实现感知接口中的setter方法,讲其setter方法中的request参数传递到本类中来: 即,在本类中定义一个成员变量,来接收setter方法中的request. 如果,还需要获取response,Ses

  • 基于Cookie与Session的Servlet API会话管理操作

    目录 ️前面的话️ 1.Cookie与Session 1.1回顾与理解Cookie与Session 1.2Servlet会话管理操作 2.常见案例实现 2.1登录逻辑的实现 2.2上传文件 ️前面的话️ 本篇文章将介绍Servlet中的会话管理操作,前面在介绍HTTP的时候,我们已经说了Cookie与Session的基本原理,Cookie相当于就诊卡,就诊卡一刷得到的信息就相当于Session,Servlet对Cookie与Session有着很好的支持,可以实现会话的管理操作. 1.Cookie

  • PHP基于cookie与session统计网站访问量并输出显示的方法

    本文实例讲述了PHP基于cookie与session统计网站访问量并输出显示的方法.分享给大家供大家参考,具体如下: <?php $f_open = fopen("count.txt","r+"); //打开指定的文件 $count = fgets($f_open); //读取文件中的数据 if(empty($_COOKIE['cookie_name'])){ //判断COOKIE的是否存在 setcookie("cookie_name",

  • 对比分析php中Cookie与Session的异同

    让大家对Cookie和Session有一个更深入的了解,并对自己的开发工作中灵活运用带来启示. 一.cookie机制 Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器.IETF RFC 2965 HTTP State Management Mechanism 是通用cookie规范.网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies . 具体来说

  • cookie、session和java过滤器结合实现登陆程序

    cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一定的作用.之所以把这三个放一起,是因为有很多时候都会是把他们结合在一起使用,例如有些登陆程序. cookie是浏览器的机制,session是服务器的机制,但是实际上cookie也是由服务器生成的,之后返回给浏览器的,并不是浏览器本身生成.当浏览器发送某个请求时,如果拥有有效的cookie则会把这个cookie带在一

  • Django框架会话技术实例分析【Cookie与Session】

    本文实例讲述了Django框架会话技术.分享给大家供大家参考,具体如下: 会话技术 1.Cookie 客户端会话技术(数据存储在客户端) 以key-value的形式进行存储 cookie的操作都是通过Response来实现的 典型场景 购物车 登录信息 支持过期时间 Cookie清除策略 默认关闭浏览器时cookie自动清除 配置Cookie过期时间 max-age=0 关闭就失效 max-age=None 永久有效 max-age = int 单位秒 expires 过期时间,和max-age

  • Javaweb会话跟踪技术Cookie和Session的具体使用

    目录 前言 一.会话引入 二.Cookie 1.Cookie的理解 2.Cookie生命周期 3.Cookie有效路径 4.Cookie使用细节 三.Session 1.Session基本原理 2.Session的理解 3.Session基本使用 4.Session底层 5.Session生命周期 前言 纸上得来终觉浅,绝知此事要躬行 一.会话引入 什么是会话?会话用来识别不同的客户端,客户端和服务器之间发生的一系列连续的请求和响应的过程,当我们打开浏览器,点击多个链接,访问服务器多个web资源

  • 基于java中cookie和session的比较

    cookie和session的比较 一.对于cookie: ①cookie是创建于服务器端 ②cookie保存在浏览器端 ③cookie的生命周期可以通过cookie.setMaxAge(2000);来设置,如果没有设置setMaxAge, 则cookie的生命周期当浏览器关闭的时候,就消亡了 ④cookie可以被多个同类型的浏览器共享  可以把cookie想象成一张表 比较: ①存在的位置: cookie 存在于客户端,临时文件夹中 session:存在于服务器的内存中,一个session域对

  • PHP入门教程之会话控制技巧(cookie与session)

    本文实例讲述了PHP会话控制技巧.分享给大家供大家参考,具体如下: Demo1.php <form method="get" action="Demo2.php"> 姓名:<input type="text" name="username" /> <br /> <input type="submit" value="提交" /> </

  • PHP cookie与session会话基本用法实例分析

    本文实例讲述了PHP cookie与session会话基本用法.分享给大家供大家参考,具体如下: cookie即是传统的会话控制,由于要存储的信息是保存在客户端的,所以安全系数较低,而session会话控制是将要存储的信息保存在服务器上的,所以相对于cookie安全系数较高. 不论是在使用cookie方式存储,还是session方式存储在使用存储的函数之前都不能有输出语句,否则会产生一个e级错误 使用cookie的存储的方式 setcookie('cookie_name','cookie_val

随机推荐