瑞吉外卖 - 完善后台系统登陆功能(5)

news2024/11/28 16:35:26

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 + JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。
相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PDe_7uIg?pwd=x548
提取码:x548

文章目录

    • 1.问题分析
    • 2.代码实现
    • 3.功能测试

1.问题分析

前面虽然我们已经实现了后台系统的员工登录功能,但是其实它并不完善。期中存在的一个问题就是即使我们不通过登陆页面也可以直接通过 “http://localhost:8080/backend/index.html”访问后台主页:

显然,这种设计是不合理的,我们希望的效果应该是,只有登陆成功后才可以访问系统中的页面,如果没有登陆则自动跳转到登陆页面。

具体如何实现呢?我们可以通过过滤器或者拦截器,在过滤器或者拦截器中判读用户是否已经完成登陆,如果没有登陆则跳转到登录界面即可。

具体的处理逻辑如下:

  1. 获取本次请求的 URI;
  2. 判断本次请求是否需要处理;
  3. 如果不需要处理,则直接放行;
  4. 判断登陆状态,如果已经登陆,则直接放行;
  5. 如果未登录,则重定向到登录页面。

2.代码实现

创建一个 filter 包用于存放我们的自定义过滤器,我们可以创建一个 LoginCheckFilter 类实现 javax.servlet.Filter 接口,重写接口的 doFilter() 方法以实现我们的登陆检查逻辑。

LoginCheckFilter 类完整代码如下:

package cn.javgo.reggie_take_out.filter;

import cn.javgo.reggie_take_out.common.R;
import com.alibaba.fastjson.JSON;
import org.springframework.util.AntPathMatcher;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

/**
 * 用户登录检查过滤器
 */
@WebFilter(filterName = "loginCheckFilter",urlPatterns = {"/*"})
public class LoginCheckFilter implements Filter {
    // 需要忽略的 URI 地址
    private static final String[] IGNORE_URI = {"/employee/login","/employee/logout","/backend/**","/front/**"};
    // AntPathMatcher 是 Spring 提供的一个通配符匹配类,支持 ?、*、** 等通配符
    private static final AntPathMatcher ANT_PATH_MATCHER = new AntPathMatcher();

    /**
     * 初始化过滤器
     * @param servletRequest 请求对象
     * @param servletResponse 响应对象
     * @param filterChain 过滤器链对象
     * @throws IOException IO异常
     * @throws ServletException Servlet异常
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 类型转换
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 1.获取请求的 URI 地址
        String requestURI = request.getRequestURI();
        // 2.判断当前的 URI 地址是否需要忽略
        boolean check = Arrays.stream(IGNORE_URI).anyMatch(uri -> ANT_PATH_MATCHER.match(uri, requestURI));
        // 3.如果需要忽略,则直接放行
        if(check){
            filterChain.doFilter(request,response);
            return;
        }
        // 4.如果用户已经登录,则直接放行
        if(request.getSession().getAttribute("employee") != null){
            filterChain.doFilter(request,response);
            return;
        }
        // 5.用户未登录,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
    }
}

上述代码实现逻辑比较简单,我们挑出部分内容进行简单分析。

  1. 为什么要忽略 {"/employee/login","/employee/logout","/backend/**","/front/**"} 几个请求?

    前面两个比较容易理解,用户访问登陆页面或退出登陆的 URI 自然没必要进行登陆检查。至于后面的 {"/backend/**","/front/**"} 也被列为可忽略的 URI 这个并不是必须的,因为如果没有经过登陆页面成功登陆,即便访问成功有也无济于事,因为访问到的页面不会有数据内容。

  2. AntPathMatcher 有何用?

    AntPathMatcher 是 Spring Framework 中的一个工具类,用于进行 Ant 风格的路径匹配(一种常用的路径匹配规则,支持通配符)。AntPathMatcher 可以帮助我们快速实现路径匹配的功能,是 Web 应用中常用的工具类之一。

    支持以下路径匹配规则:

    • ?:匹配任意单个字符
    • *:匹配任意数量的字符,包括 0 个字符
    • **:匹配任意数量的路径,包括 0 个路径
  3. 为什么最终要向客户端返回一个错误的 JSON 对象?

    在上面的源码中我们为什么莫名其妙地向客户端返回一个 R.error("NOTLOGIN"),这可能让你感到疑惑,其实这是因为前端也有自己的拦截器,会根据拿到的响应对象中的数据进行判断从而跳转指定页面。在 static/backend/index.html 页面中我们能找到对应发送 AJAX 请求的 js 文件,其中就包括了一个 request.js:

    我们追踪到 request.js 的拦截器相关位置,便能看到如下关键信息:

    处理逻辑也比较简单,当服务端返回的对象中包含 code === 0data.msg === 'NOTLOGIN' 时,便会清空浏览器的用户信息,然后跳转到登陆页面。这就是为什么我们在实现过滤器的时候最终返回 R.error("NOTLOGIN") 的原因,当然这是为了应承前端的设计,不然我们也可以通过自定义拦截器等方式进行重定向。

最后,想要我们的过滤器生效,还需要再启动类上添加 @ServletComponentScan 注解,以启用自动扫描 Servlet、Filter 和 Servlet 监听器组件。

@Slf4j
@SpringBootApplication
@ServletComponentScan
public class ReggieTakeOutApplication {

    public static void main(String[] args) {
        SpringApplication.run(ReggieTakeOutApplication.class, args);
    }

    @Bean
    CommandLineRunner commandLineRunner(){
        return args -> log.info("项目启动成功......");
    }
}

在传统的 Servlet 应用程序中,我们通常需要在 web.xml 文件中显式地声明 Servlet、Filter 和 Servlet 监听器等组件。但是,在基于 Spring 的应用程序中,我们可以使用 Spring 提供的 @ServletComponentScan 注解来自动注册这些组件。

当我们在 Spring 应用程序上下文中使用 @ServletComponentScan 注解时,Spring 将扫描指定的包及其子包中的所有 Servlet、Filter 和 Servlet 监听器组件,并将它们自动注册到 Servlet 容器中。这样,我们就可以在不编写冗长的 web.xml 文件的情况下轻松地配置 Servlet 应用程序。

需要注意的是,@ServletComponentScan 注解只会扫描使用了 @WebServlet@WebFilter@WebListener 注解的组件,并将它们自动注册到 Servlet 容器中。如果我们使用传统的 Servlet API 来定义这些组件,则需要手动注册它们。这也是为什么我们要在 LoginCheckFilter 过滤器上添加 @WebFilter(filterName = "loginCheckFilter",urlPatterns = {"/*"}) 注解的原因,其中指定了过滤器的名称为 “loginCheckFilter”,并过滤所有请求。

3.功能测试

启动程序,如果我们不进行登陆,直接访问后台主页 “http://localhost:8080/backend/index.html”,那么就会自动跳转到登陆页面:

当然,我们还可以直接在前端拦截器的对应位置处,打上断点,再直接访问 “http://localhost:8080/backend/index.html”进行断点调试,查看执行细节:

可以看到,客户端正常拿到了预期的数据,然后按照执行逻辑就会跳转到登陆页面了:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

北邮22信通:电子电路实验:分享一个存放零散电阻的小方法

北邮22信通一枚~ 很高兴以一个新身份和大家见面! 有关电子电路实验的新专栏即将开启,会尽量分享一些实验报告方面的文章,大家敬请期待~ 这篇文章想和大家分享困扰小编好久的问题的解决方法!同时也就作为专栏开启的引子啦~ 事…

DJI A3飞控 遥控器信号中断 会导致什么问题?

DJI A3飞控 遥控器信号中断 会导致什么问题? 在使用DJI A3 飞控的过程中,希望用OSDK完成自动化的任务。 DJI A3要求必须连接遥控器,可以是大疆Lightbridge的遥控器,也可以是SBUS协议的遥控器,比如航模的支持SBUS协议的…

【历史上的今天】4 月 17 日:Turbo Pascal 2.0 发布;PlayStation 遭受攻击;搜狐李善友辞职

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 4 月 17 日,在 1790 年的今天,电学奠基人富兰克林逝世。美国的杰出发明家本杰明富兰克林从 1746 年开始研究电的现象,通过反…

问卷调查设计攻略!这些原则步骤让你的结果更精准

调查问卷是从特定人群中收集数据的有效工具。在设计调查问卷时,我们必须仔细考虑研究目标、目标受众和所需信息的类型。调查问卷的设计原则和步骤对于确保所收集数据的准确性和可靠性非常重要。在本文中,我们将讨论问卷的设计原则和步骤。 一、问卷设计…

Vivado输入输出时序约束(set_input_delay、set_output_delay)

前言 I/O Delay约束主要有两个命令:set_input_delay和set_output_delay。 I/O Delay约束的主要目的同时钟约束一样,是告诉编译器,外部输入输出信号与参考时钟之间的相位关系,便于综合器能够真实和准确的对IO接口的信号进行…

打造一流软件测试工程师的技能图谱

目录 引言 测试工程师面临的核心问题 概述 测试设计 代码能力 阅读开发代码 自动化测试的开发 自动化测试 UI自动化 接口自动化 质量管理流程 行业技术知识 数据库 关系型数据库 非关系型数据库 RDBMS vs NoSQL 业务知识 技术的准备 一、测试基础 二、Linu…

IDEA配置Maven教程(超详细版~)

文章目录 前言一、Maven下载二、配置Maven环境变量三、settings.xml配置文件修改四、打开IDEA配置Maven 前言 本文介绍在IDEA中配置Maven 一、Maven下载 首先我们进入maven官方网站,进入网页后,点击Download去下载 下载免安装版,解压即可,…

软件测试面试八股文,正在面试的同学请仔细观看

目录 第一类问题:自我介绍(心理学首因效应告诉我们第一印象非常重要) 第二类问题:项目介绍(项目经验直接决定一个人能否胜任一份工作,企业更应该看重一个人解决问题的思路和具体能力) 第三类…

【1 Vue - 初识】

1 认识Vue Vue的本质,就是一个JavaScript的库框架. Vue与原生开发相比,有以下几个优势: 1 数据绑定:Vue使用双向绑定技术,可以方便地绑定数据与视图,数据变化时,视图自动更新。而原生开发需要…

安全基础第十一天:nginx

目 录 一、nginx的反向代理 1.反向代理原理 2.反向代理的几种算法 (1)轮询(默认) (2)weight (3)ip_hash (4)fair(第三方) …

springboot+vue家乡特色推荐系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的家乡特色推荐系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

客户端跨端动态化方案现状

前言 客户端现状 工作中,经常遇到产品想尽快上线看数,CR业务也总是倒排期状态,native 的发版窗口是他们经常要关注的,往往因为窗口时间问题,导致某个需求业务迭代周期长,客户端开发在业务动态化方面多有被…

毫米波雷达系列 | 传统CFAR检测(有序统计类)

毫米波雷达系列 | 传统CFAR检测(有序统计类) 1.OS-CFAR 有序统计类CFAR检测器(OS-CFAR)与均值类CFAR检测器处理过程不同,在对背景杂波功率进行估计时,需要将所有参考单元进行升序排列得到一个新的有序数列,在新序列中选取第k个值…

【Python | 深度学习】safetensors 包的介绍和使用案例(含源代码)

safetensors 是一种用于安全存储张量(与 pickle 相反)的新型简单格式,并且仍然很快(零拷贝)。 safetensors 真的很快。 一、安装 1.1 pip 安装 pip install safetensors1.2 conda 安装 conda install -c huggingf…

【HTML5系列】第二章 · HTML5新增功能

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

我写了一套uniapp微信小程序投票系统实战课程 (SpringBoot2+vue3.2+element plus ) 实战课程,免费分享给CSDN的朋友们

大家好,我是锋哥,最近写了一套前后端分离的uniapp微信小程序投票系统,逼格略高,专门为Java初学者提升技术层次和方便就业而精心打造。希望你们喜欢!(文末领取) 一,Java就业实战课程简…

STC单片机使用示例分别介绍 CCP/PCA在4种工作模式下的使用

STC单片机使用示例分别介绍 CCP/PCA在4种工作模式下的使用 📍针对利用PCA对上升或下降沿捕获功能,可以看这篇有关脉宽测量《STC15单片机利用PCA功能测量脉宽应用示例》 🍁应用场景: 🎉STC15系列部分单片机集成了3路可编程计数器阵列(CCP/PCA)模块(STC15W4K32S4系列单…

DOM事件模型与事件委托

事件 JS与HTML之间的交互通过事件实现。 事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。 可以使用监听器来预定事件,以便事件发生时执行相应的代码。这种在传统软件工程中被称为观察者模式 事件流 事件流描述的是从页面中接受事件的顺序 事件冒泡 微软…

【李老师云计算】实验三:在Docker中部署Hadoop集群

索引 0. 前言1. Docker1.1 安装Docker1.2 启动Docker 2. Dokcer部署Hadoop2.1 设计Hadoop集群结构2.2 拉取Hadoop镜像2.3 ★解决拉取镜像时 - no space left on device2.4 创建Docker容器2.5 ★解决docker ps没有内容2.6 通过终端进入容器2.7 关闭防火墙2.8 配置SSH2.8.1 设置主…

springboot+vue留守儿童爱心网站(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的留守儿童爱心网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…