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

news/2024/4/29 19:35:28/文章来源:https://blog.csdn.net/m0_62946761/article/details/129287050

目录

一、项目简介

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

三、实现登录功能

四、拦截访问请求


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

一、项目简介

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

资源我们放在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;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PMP怎么对项目工程师的职业生涯产生影响?

职业生涯的影响无非两个&#xff1a; 工作能力增强升职加薪 考取证书你能获得&#xff1a; a、全面的、科学的、专业的项目管理架构理论知识; b、经过模拟实践题的联系&#xff0c;项目经验可以媲美拥有三年以上的项目管理经验的项目管理人士; c、所学的知识基础与实践已经获得…

【云原生kubernetes】k8s中job与cronjob使用详解

一、前言 job&#xff0c;顾名思义就是任务&#xff0c;job的概念在很多框架中都有&#xff0c;而且实际业务场景中也使用非常广泛&#xff0c;比如大家熟悉的hadoop&#xff0c;客户端可以向集群提交一个job&#xff0c;然后集群根据一定的调度策略来处理这个job&#xff1b; …

Ep_MySQL基础-存储引擎

show engines; //查看mysql所支持的存储引擎&#xff0c;以及从中得到mysql默认的存储引擎 MyIsam存储引擎:(非聚集索引)->数据索引不在一起 Innodb存储引擎:(聚集索引)->数据索引在一起 MyISAM 每个MyISAM数据表&#xff0c;皆由存储在硬盘上的3个文件所组成, .f…

电脑C盘满了,怎么清理c盘空间?

电脑的C盘是系统盘&#xff0c;存储着操作系统和软件等关键文件&#xff0c;因此当C盘空间不足时&#xff0c;电脑的性能和稳定性都会受到影响。 真实案例&#xff1a;c盘空间莫名其妙变小&#xff1f; “C盘快满了不敢乱删&#xff0c;请问该如何清理&#xff1f;” “求大佬…

心理学上10点建议,打造更好的用户体验

对于产品设计而言&#xff0c;“了解你的用户”是非常重要的设计原则。虽然我无法通过这一篇文章来清楚地总结与用户有关的所有信息&#xff0c;但仍然可以提炼出一些最重要的设计原则及注意事项。而对用户体验设计师来说&#xff0c;为了设计出最友好的用户体验&#xff0c;也…

resultMap 用法?工作中是怎么实现“多表联查”的?

目录 一、resultMap用法 1.1、使用场景 1.2、用法说明 1.2.1、模拟场景 1.2.2、使用 二、多表联查 2.1、分析 2.2、具体步骤 2.3、总结 一、resultMap用法 1.1、使用场景 字段名称和程序中的属性名不同的情况&#xff0c;可使⽤ resultMap 配置映射&#xff1b;⼀对⼀…

如果我只有一个奔腾CPU,怎么加速推理神经网络?

前言 有人说当下的AI热潮不过是算力堆砌的产物。现在层出不穷的各种大模型大训练集&#xff0c;使用复杂精致的技术在排行榜上不断刷新分数&#xff0c;这些人似乎忘了一件事情&#xff0c;AI模型最终是要落地的&#xff0c;是要用的&#xff0c;如果不能普及开去那和在象牙塔…

6款yyds的可视化搭建开源项目

之前我一直在研究低代码可视化相关的技术和产品, 也主导过很多可视化搭建项目, 主要目的是降低企业研发成本和缩短产品交付周期, 随着互联网技术的发展也陆陆续续有很多优秀的技术产品问世, 接下来我就和大家分享几款非常有价值的可视化搭建项目, 助力企业数字化转型. 1. Form…

轻松搞懂Linux中的用户管理

文章目录概念用户账户用户组用户权限用户管理工具概念 用户管理是Linux系统管理员必须掌握的重要技能之一。Linux系统是一个多用户操作系统&#xff0c;可以支持多个用户同时使用&#xff0c;每个用户拥有自己的账户和权限&#xff0c;因此管理员需要了解如何创建、管理和删除…

一篇文章帮助你初步了解CDN内容分发网络

文章目录CDN内容分发网络CDN内容分发网络的工作原理CDN的作用CDN如何实现内容的加速CDN内容分发网络 CDN&#xff08;Content Delivery Network&#xff09;内容分发网络。CDN 是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过…

lambada表达式

负壹、 函数式编程 Java为什么要支持函数式编程&#xff1f; 代码简洁 函数式编程写出的代码简洁且意图明确&#xff0c;使用stream接口让你从此告别for循环。 多核友好 Java函数式编程使得编写并行程序从未如此简单&#xff0c;你需要的全部就是调用一下parallel()方法。 Jav…

【干货】又是一年跳槽季!Nginx 10道核心面试题及解析

Nginx是一款轻量级的高性能Web服务器和反向代理服务器&#xff0c;由俄罗斯的Igor Sysoev开发。它具有占用资源少、高并发、稳定性高等优点&#xff0c;被广泛应用于互联网领域。在Nginx的面试过程中&#xff0c;面试官通常会提出一些核心问题&#xff0c;本文将介绍一些常见的…

【STM32】cmsis-dap调试器-OpenOCD功能集成进CubeIDE中

前言 被自己买的Jlink真是要整烦了 一下连不上&#xff0c;一下固件掉升级&#xff0c;一下说是D版不给调试 于是乎决定&#xff0c;我买了个CMSIS-DAP调试器&#xff0c;决定放弃JLink这等#$%^&货… CMSIS-DAP 调试器 这个是开源调试器&#xff0c;硬件软件开源&#x…

学习笔记-架构的演进之服务容错策略-服务发现-3月day01

文章目录前言服务容错容错策略附前言 “容错性设计”&#xff08;Design for Failure&#xff09;是微服务的一个核心原则。 使用微服务架构&#xff0c;拆分出的服务越来越多&#xff0c;也逐渐导致以下问题&#xff1a; 某一个服务的崩溃&#xff0c;会导致所有用到这个服务…

离线安装samba与配置(.tar方式安装)

一、samba离线安装【安装并设置成功后&#xff0c;相关文件及其位置&#xff1a;①smbd&#xff1a;/usr/local/samba/sbin/smbd②nmdb&#xff1a;/usr/local/samba/sbin/nmbd③配置文件 smb.conf&#xff1a;/usr/local/samba/lib/smb.conf④添加用户的 smbpasswd 文件&#…

关于小程序内存在违规内容的处理警告

遇到了问题&#xff0c;就记录一下解决过程吧 小程序涉及提供在线观看视频服务&#xff0c;请补充文娱-视频广场类目&#xff1b; 我们的小程序做了一个类似抖音上下滑动观看视频的页面&#xff0c;被警告了&#xff0c;查看了文档&#xff0c; https://developers.weixin.qq.…

Python常用标准库-os库一文详解(一):目录操作

目录 前言 目录操作 1.1获取当前目录 获取当前工作目录(绝对路径) 获取当前工作目录(绝对路径) 获取当前目录 获取当前目录的上级目录 1.2创建目录 1.3删除目录 1.4重命名目录 1.5切换目录 1.6获取目录下的文件内容 1.7判断目录是否存在 1.8判断是否是目录 1.9判断是否是绝…

如何成为一款好的低代码平台?

目录 一、一款好的低代码平台应该是什么样的&#xff1f; 二、低代码核心能力 01、全栈可视化编程&#xff1a; 02、全生命周期管理&#xff1a; 03、低代码扩展能力&#xff1a; 三、小结 一、一款好的低代码平台应该是什么样的&#xff1f; 从企业角度来说&#xff0c…

(五十六)针对主键之外的字段建立的二级索引,又是如何运作的?

上一次我们已经给大家彻底讲透了聚簇索引这个东西&#xff0c;其实聚簇索引就是innodb存储引擎默认给我们创建的一套基于主键的索引结构&#xff0c;而且我们表里的数据就是直接放在聚簇索引里的&#xff0c;作为叶子节点的数据页&#xff0c;如下图。 而且我们现在也对基于主键…

物理机不能访问虚拟机kali的web服务解决方案记录

目录 环境 问题描述 解决方案 知识补充 效果测试 其他思路 环境 kali&#xff08;nat模式&#xff09;&#xff0c;物理机&#xff0c;可互ping 问题描述 kali的web服务器不能在物理机上访问。 1.本机能ping通虚拟机 2.虚拟机也能ping通本机 3.虚拟机能访问自己的web …