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

news2024/11/15 12:53:50

目录

一、项目简介

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

三、实现登录功能

四、拦截访问请求


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

一、项目简介

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

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

    /*
     * 设置静态资源映射
     */
    @Override
    protected 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 {

    @Autowired
    private 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中的用户Id
        request.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();


    @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();

        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.coloradmin.cn/o/382207.html

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

相关文章

Postman的下载和安装

文章目录一 下载二 安装一 下载 官网下载地址&#xff1a;https://www.postman.com/ 进入官网页面&#xff0c;选择对应的操作系统和版本&#xff0c;然后进入Postman下载页面&#xff0c;然后点击 Windows 64-bit 即可下载&#xff0c;如下 二 安装 Postman的安装很简单&am…

Python每日一练(20230302)

目录 1. 字符串统计 2. 合并两个有序链表 3. 下一个排列 附录 Python字典内置方法 增 删 改 查 其它 1. 字符串统计 从键盘输入一个包含有英文字母、数字、空格和其它字符的字符串&#xff0c;并分别实现下面的功能&#xff1a;统计字符串中出现2次的英文字母&#…

C++---最长上升子序列模型---友好城市(每日一道算法2023.3.2)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度"的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; Palmia国有一条横贯东西的大河&#xff0c;河有笔直的南北两岸&#xff0c;岸上各有位置各不相同的N个城市。 北岸的每个城市有且仅有…

python自学之《21天学通Python》(18)——第21章 案例2 Python搞定大数据

“大数据&#xff08;Big Data&#xff09;”这个术语最早期的引用可追溯到apache org的开源项目Nutch。当时&#xff0c;大数据用来描述为更新网络搜索索引需要同时进行批量处理或分析的大量数据集。随着谷歌MapReduce和GoogleFileSystem &#xff08;GFS&#xff09;的发布&a…

第十三节 继承

什么是继承&#xff1f; java中提供一个关键字extends&#xff0c;用这个关键字&#xff0c;我们可以让一个类和另一个类建立父子关系。 public class Student extends People{} student为子类&#xff08;派生类&#xff09;&#xff0c;people为父类&#xff08;基类或者超类…

激光雷达迈向规模量产期:如何看待3类玩家的竞争格局?

激光雷达正进入规模量产周期。 高工智能汽车研究院监测数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;乘用车前装标配激光雷达交付12.99万颗&#xff0c;配套新车11.18万辆&#xff0c;同比分别增长1544.30%和2626.82%&#xff1b;预计2023年标配交付将…

第四回:文字图例尽眉目

import matplotlib import matplotlib.pyplot as plt import numpy as np import matplotlib.dates as mdates import datetime一、Figure和Axes上的文本 Matplotlib具有广泛的文本支持&#xff0c;包括对数学表达式的支持、对栅格和矢量输出的TrueType支持、具有任意旋转的换…

Python进阶-----面向对象2.0(特有属性和方法与私有属性和方法)

目录 前言&#xff1a; 1.添加特有属性/方法 示例1&#xff1a;添加特有属性 示例2&#xff1a;添加特有方法 2.私有属性/方法 &#xff08;1&#xff09;私有化示例 &#xff08;2&#xff09; 私有化属性/方法可以在类的内部使用 &#xff08;3&#xff09;强制访问私…

一:BT、BLE版本说明及对比

蓝牙版本说明1.常见名词说明2.BT&BLE特性对比3.BT各版本对比4.BLE各版对比1.常见名词说明 名称说明BR(Basic Rate)基本码率EDR(Enhanced Data Rate)增强码率BLE(Bluetooth Low Energy)低功耗蓝牙HS(High Speed)高速蓝牙BT(BlueTooth)蓝牙技术LE(Low Energy)低能耗AFH(Adap…

态路小课堂丨光模块使用可能遇到的4大问题以及注意事项!

光模块作为光通信系统的核心器件&#xff0c;其内部集成了精密的光学元件和电路元件。在日常使用过程中如果不按规定操作&#xff0c;很容易导致光模块损坏。本文态路通信为您介绍光模块在使用时可能遇到的问题&#xff0c;以及我们应该注意的事项。以此来减少光模块使用寿命&a…

Spring 事务(编程式事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

文章目录1. 事务的定义2. Spring 中事务的实现2.1 MySQL 中使用事务2.2 Spring 中编程式事务的实现2.3 Spring 中声明式事务2.3.1 声明式事务的实现 Transactional2.3.2 Transactional 作用域2.3.3Transactional 参数设置2.3.4 Transactional 异常情况2.3.5 Transactional 工作…

桑基图绘制

绘制桑基图 但是关于数据流上的数据标签可能还得用ps… 注意 1、节点&#xff08;nodes&#xff09;要包括各层的&#xff0c;且不能重复&#xff0c;需要自己在后边append几个数据 2、数据流的数据要是整数&#xff0c;不能时numpy 3、注意表格加入时要再由array转为list&a…

大数据技术之Maxwell入门案例学习

大数据技术之Maxwell入门案例学习 文章目录大数据技术之Maxwell入门案例学习1、写在前面2. Maxwell 使用2.1 Maxwell 安装部署2.2 Maxwell 入门案例2.2.1 监控 Mysql 数据并在控制台打印2.2.2 监控 Mysql 数据输出到 kafka2.2.3 监控 Mysql 指定表数据输出控制台2.2.4 监控 Mys…

分布式监控系统——Zabbix(4)可视化、模板和用户参数

文章目录分布式监控系统——Zabbix&#xff08;4&#xff09;可视化、模板和用户参数一、zabbix可视化1.简介2.自定义图形&#xff08;Graphs&#xff09;3.聚合图形&#xff08;Screens&#xff09;4.幻灯片演示&#xff08;Slide shows&#xff09;5.定义拓扑图&#xff08;M…

企业电销如何获得高质量精准流量,大数据获客直击精准客流

随时社会的发展&#xff0c;时代的进步&#xff0c;各行各业都在崛起&#xff0c;竞争力愈演愈烈&#xff0c;那么为了使自己的品牌得到更多人的关注&#xff0c;自己的产品可以更好的销售&#xff0c;无数的老板在想各种缤纷的办法让自己赚钱&#xff0c;百度竞价&#xff0c;…

图像处理│一张自拍即可实现变老变年轻,带你感受时光流逝之美

✨ 目录&#x1f388; 项目效果&#x1f388; 环境搭建&#x1f388; 下载PaddleGAN&#x1f388; 安装飞浆&#x1f388; 生成图片潜码&#x1f388; 老龄化处理&#x1f388; 年轻化处理&#x1f388; 项目效果 飞浆是一个由百度推出的深度学习开发平台&#xff0c;为开发者…

Ep_MySQL基础-存储引擎

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

光学设计软件Ansys的Lumerical 2023版本下载与安装使用

文章目录前言一、许可管理工具安装二、许可管理器配置三、Lumerical安装四、工具使用配置总结前言 Lumerical是一款功能强大的软件&#xff0c;用于设计和分析从组件到系统阶段的光子学和电磁学。这个版本的Lumerical改进了电子和光子学设计工具&#xff0c;用于复杂光子学&am…

【JAVA程序设计】【C00108】基于Springboot+Vue前后端分离的民宿短租预约管理系统

基于SpringbootVue前后端分离的民宿短租预约管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于Springbootvue开发的民宿短租预订管理系统&#xff0c;共分为三种权限&#xff1a;系统管理员、商家、用户 管理员角色包含以下功能&#xff1a; 个人中心、修改密码…

C++——优先级队列(priority_queue)的使用及实现

目录 一.priority_queue的使用 1.1、基本介绍 1.2、优先级队列的定义 1.3、基本操作(常见接口的使用&#xff09; 1.4、重写仿函数支持自定义数据类型 二.priority_queue的模拟实现 2.1、构造&&重要的调整算法 2.2、常见接口的实现 push() pop() top() empt…