当前位置: 首页 > news >正文

SpringBoot实现静态资源映射,登录功能以及访问拦截验证——以黑马瑞吉外卖为例

目录

一、项目简介

二、设置静态资源访问路径

三、实现登录功能

四、拦截访问请求


本篇文章以黑马瑞吉外卖为例

一、项目简介

瑞吉外卖项目分为后台和前台系统,后台提供给管理人员使用,前台则是用户订餐使用

资源我们放在resources下

二、设置静态资源访问路径

我们的资源放在resources下,当我们访问localhost:8080/backend/page/login/login.html后台登录时发现无法访问,因为springboot只要静态资源放在类路径下: called /static (or /public or /resources or /META-INF/resources

才能访问,所以我们需要自定义一下资源的访问路径

我们可以通过重写 WebMvcConfigurationSupport 的 addResourceHandlers 设置静态资源访问路径, 代码如下:

@Configuration
@Slf4j
public class WebMvcConfig extends WebMvcConfigurationSupport {/** 设置静态资源映射*/@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {log.info("开始进行静态资源映射...");registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");}
}

 于是就能访问了

三、实现登录功能

通过网页检查->console 可以知道登录页面会向 employee/login 发送请求,所以我们写一个controller,实现对应的方法处理请求。对于登录请求的思路大致如下:

  1. 因为数据库的密码使用md5加密,所以需要先对密码进行md5加密
  2. 将提交的用户名查询数据库是否有对应的用户,无则提示登陆失败
  3. 将查出的用户密码进行比对,不同则则提示登陆失败
  4. 将用户id放入session域中供后面使用
@RestController
@Slf4j
@RequestMapping("/employee")
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@PostMapping("/login")public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee)             {//1.将页面提交的密码password进行md5加密String password = employee.getPassword();password = DigestUtils.md5DigestAsHex(password.getBytes());//2.根据页面提交的用户名查询数据库LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();wrapper.eq(Employee::getUsername, employee.getUsername());Employee user = employeeService.getOne(wrapper);//3.找不到用户或者密码比对失败或者账户被禁用返回错误消息if(user == null || !user.getPassword().equals(password)) {return R.error("登录失败");}if(user.getStatus() == 0) {return R.error("账户已禁用");}//4.登陆成功,将用户Id放入session域request.getSession().setAttribute("employee", user.getId());return R.success(user);}
}

 登录成功

 这里我们还要实现一下登出功能,在右上角点击可以登录,我们只需要写一个对应的方法即可,需要清楚session域中的用户id,返回退出成功的信息。

    /** 员工退出*/@PostMapping("/logout")public R<String> logout(HttpServletRequest request) {// 清除session中的用户Idrequest.getSession().removeAttribute("employee");return R.success("退出成功");}

四、拦截访问请求

登出后我们发现直接请求员工列表也是可行的,这当然是不合理的,如果没有登陆的请求应该返回登录页面,我们可以通过一个全局过滤器实现请求的拦截,步骤如下:

对于不需要拦截的请求放行,需要的我们查看session域中是否有用户id存在,不存在则跳转回登陆页面

由于前端响应拦截器使用的是json形式,所以我们需要返回 json 形式的对应字符串

@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {// 路径匹配器,支持通配符public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse)servletResponse;// 1.获取请求的URIString requestURI = request.getRequestURI();String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};// 2.判断访问的URI需不需要登录才可访问log.info("拦截到请求{}", requestURI);if(check(urls, requestURI)) {log.info("本次请求{}不需要处理", requestURI);filterChain.doFilter(request, response);return;}// 3.已经登录无需处理直接放行if(request.getSession().getAttribute("employee") != null) {log.info("用户已登录,id为{}" + request.getSession().getAttribute("employee"));filterChain.doFilter(request, response);return;}// 4. 如果未登录返回未登录结果,通过输出流的方式向客户端返回响应数据log.info("用户未登录");response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));return;}/** 路径匹配,判断是否需要放行*/public boolean check(String[] urls, String url) {for(String item : urls) {if(PATH_MATCHER.match(item, url)) {return true;}}return false;}
}

相关文章:

SpringBoot实现静态资源映射,登录功能以及访问拦截验证——以黑马瑞吉外卖为例

目录 一、项目简介 二、设置静态资源访问路径 三、实现登录功能 四、拦截访问请求 本篇文章以黑马瑞吉外卖为例 一、项目简介 瑞吉外卖项目分为后台和前台系统&#xff0c;后台提供给管理人员使用&#xff0c;前台则是用户订餐使用 资源我们放在resources下 二、设置静态…...

PythonWeb Django PostgreSQL创建Web项目(三)

了解Django框架下如何配置数据库链接与创建模型和应用 使用Django创建web项目&#xff0c;首先需要了解生成的项目文件结构&#xff0c;以及对应文件功能用途方可开始web项目页面创建&#xff0c;下方先介绍文件功能&#xff0c;之后再配置数据库连接以及管理创建模型与应用&a…...

【Visual Studio】git提交代码时使用GPG

前言 下载安装GPG的过程省略,直接开始进行配置 0.visual studio 版本说明 其余版本未测试,但是应该也是可以的 1 获取GPG的密钥ID 1.1 window下可以打开Kleopatra查看生成好的密钥的密钥ID 1.2 也可以从命令行中获取 gpg --list-keys 红框位置,后16位就是密钥ID 2 配置.git…...

【反序列化漏洞-02】PHP反序列化漏洞实验详解

为什么要序列化百度百科上关于序列化的定义是&#xff0c;将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis&#xff0c;与数组类似)。以后&#xff0c;可以通过…...

Gateway网关的使用

Gateway服务网关Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。1…...

【LeetCode】背包问题总结

文章目录一、背包能否装满&#xff1f;416. 分割等和子集1049. 最后一块石头的重量 II二、装满背包有几种方法&#xff1f;494. 目标和518.零钱兑换II377. 组合总和 Ⅳ70. 爬楼梯三、背包装满的最大价值474.一和零四、装满背包最小物品数322. 零钱兑换279.完全平方数一、背包能…...

Java的开发工具有哪些?这十款工具大厂都在用!

工欲善其事必先利其器&#xff0c;各位同学大家好&#xff0c;我是小源~本期文章&#xff0c;给大家推荐十款Java的开发工具。一、 文本编辑器主要推荐三款&#xff1a;notepad、editplus、sublime text。这三款编辑工具&#xff0c;在我们的开发工作中几乎是相差无几&#xff…...

web学习-Node.js入门学习

web学习-Node.js入门学习1.回顾与思考2. 初识Node.js2.1 Node.js的简介2.2Node.js的环境安装2.3. fs文件系统模块2.3.1 fs.readFile()2.3.2 fs.writeFile()2.3.3 练习-整理考试成绩2.3.4 fs模块-路径动态拼接的问题2.4 path路径模块2.5 http模块2.5.1 服务器相关的概念2.5.2 创…...

100 eeeee

全部 答对 答错 敏捷综合训练3 1.看板中的精益生产概念是如何减少工作在瓶颈时期的影响&#xff1f; A它不会减少瓶颈&#xff0c;因为瓶颈是任何生产系统不可避免的副产品 B通过运用 5Y 分析根本原因 C通过成为一个及时的进度系统 D通过每周完善活动 答错了 收藏 学员得…...

物盾安全汤晓冬:工业互联网企业如何应对高发的供应链安全风险?

编者按&#xff1a;物盾安全是一家专注于物联网安全的产品厂商&#xff0c;其核心产品“物安盾”在能源、制造、交通等多个领域落地&#xff0c;为这些行业企业提供覆盖物联网云、管、边、端的安全整体解决方案。“物安盾”集成了腾讯安全制品扫描&#xff08;BSCA&#xff09;…...

微纳制造技术——基础知识

1.什么是直接带隙半导体和间接带隙半导体 导带底和价带顶处以同一K值&#xff0c;称为直接带隙半导体 导带底和价带顶不处在同一K值&#xff0c;称为间接带隙半导体 2.扩散和漂移的公式 3.三五族半导体的性质 1.high mobility 2.wide bandgap 3.direct bandgap 4.三五族…...

Makefile的使用

Makefile的使用 自动化编译脚本&#xff0c;这个东西就是&#xff0c;进行简单的设置&#xff0c;然后实现原码编成为相应程序&#xff0c;简单化自己进行相关操作的过程。不需要一个个自己进行全部进行输入。而且还有许多的简化书写方法。 ​ 这个Makefile的本质为一种脚本语言…...

RealBasicVSR模型转成ONNX以及用c++推理

文章目录安装RealBasicVSR的环境1. 新建一个conda环境2. 安装pytorch(官网上选择合适的版本)版本太低会有问题3. 安装 mim 和 mmcv-full4. 安装 mmedit下载RealBasicVSR源码下载模型文件写一个模型转换的脚步测试生成的模型安装RealBasicVSR的环境 1. 新建一个conda环境 cond…...

C语言作用域(变量生存的空间)学习

C 作用域规则 任何一种编程中&#xff0c;作用域是程序中定义的变量所存在的区域&#xff0c;超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量&#xff1a; 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数参数定义中 让我们来看看什么是局…...

Spark性能优化一 概念篇

&#xff08;一&#xff09;宽依赖和窄依赖 窄依赖(Narrow Dependency)&#xff1a;指父RDD的每个分区只被子RDD的一个分区所使用&#xff0c;例如map、filter等 这些算子一个RDD&#xff0c;对它的父RDD只有简单的一对一的关系&#xff0c;也就是说&#xff0c;RDD的每个part…...

[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 二分查找实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SearchFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要…...

3.基于Label studio的训练数据标注指南:文本分类任务

文本分类任务Label Studio使用指南 1.基于Label studio的训练数据标注指南&#xff1a;信息抽取&#xff08;实体关系抽取&#xff09;、文本分类等 2.基于Label studio的训练数据标注指南&#xff1a;&#xff08;智能文档&#xff09;文档抽取任务、PDF、表格、图片抽取标注等…...

Python进阶-----面向对象3.0(面对对象三大特征之---封装)

目录 前言&#xff1a; 什么是封装 Python私有化封装 习题 前言&#xff1a; 上一期是讲解Python中类的私有属性和方法&#xff0c;其实很好理解&#xff0c;我给一个类中的部分属性进行加密拒绝访问&#xff08;上一期链接Python进阶-----面向对象2.0&#…...

软考中级软件设计师备考建议

前言 首先我说一下个人对这个考试的一个感受看法&#xff0c;我觉得软件设计师考试并不难&#xff0c;主要是不要被内心的恐惧吓倒&#xff0c;考试中心态真的很重要&#xff01; 一、中级软件设计师科目包括&#xff1a; &#xff08;1&#xff09;计算机与软件工程知识&am…...

【机器学习】决策树(理论)

决策树&#xff08;理论&#xff09; 目录一、何为决策树1、决策树的组成2、决策树的构建二、熵1、熵的作用2、熵的定义3、熵的计算4、条件熵的引入5、条件熵的计算三、划分选择1、信息增益&#xff08; ID3 算法选用的评估标准&#xff09;2、信息增益率&#xff08; C4.5 算法…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...