基于Springboot外卖系统05:用户非登陆状态的页面拦截器实现

1. 完善登录功能

1.1 问题分析

用户访问接口验证,如果用户没有登录,则不让他访问除登录外的任何接口。
1.前端登录,后端创建session,返给前端

2.前端访问其他接口,失效或不存在,则返回失效提示,前端根据接口返回的失效提示,让其跳转到登录界面

1). 目前现状

用户如果不登录,直接访问系统首页面,照样可以正常访问。

 2). 理想效果

只有登录成功后才可以访问系统中的页面,如果没有登录, 访问系统中的任何界面都直接跳转到登录页面。

 1.2 拦截器思路

 如果未登录,我们需要给前端返回什么样的结果呢? 这个时候, 我们可以去看看前端是如何处理的 ?

 1.3 代码实现

1). 定义登录校验过滤器

自定义一个过滤器 LoginCheckFilter 并实现 Filter 接口, 在doFilter方法中完成校验的逻辑。 

package com.itheima.reggie.filter;import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
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;/*** Description: 检查用户是否已经完成登陆*/@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")  //设置拦截器,设置拦截的网页区域
@Slf4j
public class LoginCheckFilter implements Filter {// 路径匹配器,支持通配符,因为下面的序列使用了通配符// AntPathMatcher匹配规则  ? 匹配一个字符    * 匹配0个或多个字符   ** 匹配0个或多个目录/字符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;//  A. 获取本次请求的URIString requestURI = request.getRequestURI();log.info("拦截的请求:{}",requestURI);// 定义不拦截的序列,只拦截页面数据请求,不拦截页面格式String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};//  B. 判断本次请求, 是否需要登录, 才可以访问boolean check = check(urls, requestURI);//  C. 如果不需要,则直接放行if(check){log.info("本次请求{}不需要处理",requestURI);filterChain.doFilter(request,response);return;}//  D. 判断登录状态,如果已登录,则直接放行if(request.getSession().getAttribute("employee")!=null){log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));filterChain.doFilter(request,response);return;}//  E. 如果未登录, 则返回未登录结果response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));return;}public boolean check(String[] urls,String requestURI){/**@Description: 路径匹配,检查本次请求是否需要放行* @author LiBiGo* @date 2022/8/12 16:50*/for (String url : urls) {boolean match = PATH_MATCHER.match(url, requestURI); // 使用通配符对象,配对资源if(match){return true;}}return false;}
}

2). 开启组件扫描

package com.itheima.reggie;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@Slf4j //是lombok中提供的注解, 用来通过slf4j记录日志。
@SpringBootApplication // 启动类
// 需要在引导类上,加上Servlet组件扫描的注解,来扫描过滤器配置的@WebFilter注解,扫描后,使过滤器在运行时生效。
@ServletComponentScan //  扫描拦截器注解public class ReggieApplication {/**@Description: 当搭建完上述的基础环境之后, 就可以通过引导类, 启动该项目。* @author LiBiGo* @date 2022/8/12 0:23*/public static void main(String[] args) {SpringApplication.run(ReggieApplication.class,args);log.info("项目启动成功............");}
}

1.4 功能测试

将工程重启,然后在浏览器地址栏直接输入系统管理后台首页,然后看看是否可以跳转到登录页面即可。

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

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

相关文章

Sargable 与 谓语下推 (predicate pushdown) 简介

关键词:SQL优化 , sargable , pushdown filter , predicate pushdown Sargable Sargable Search ARGument ABLE ,即SQL中可利用数据库自身索引优势对查询条件进行执行性能优化。换句话说,即可以利用存储层的索引优势来优化的查询条件。wikip…

python删除指定行_关于csv:删除python中的特定行和对应文件

我想删除90%的"转向"值等于0的行。这三个图像都有一个对应的图像文件,中间,左边和右边。我也要删除它们。csv文件如下:我编写了以下代码,以至少获取转向值为0的文件。我所需要的就是随机获取90%的文件并删除它们的代码。…

I2C总线传输协议

简介 I2C(Inter-integrated Circuit)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计并用于自己的芯片上,一开始只允许100kHz…

基于Springboot外卖系统06: 新增员工功能+全局异常处理器

2. 新增员工 2.1 需求分析 后台系统中可以管理员工信息,通过新增员工来添加后台系统用户。点击[添加员工]按钮跳转到新增页面,如下 当填写完表单信息, 点击"保存"按钮后, 会提交该表单的数据到服务端, 在服务端中需要接受数据, 然后将数据保…

Linq 实现sql中的not in和in条件查询

T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID in (1, 2)T-SQL的NOT IN: Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID not in (1, 2)Or Select ProductID, ProductName…

spring aop实现原理_Spring 异步实现原理与实战分享

最近因为全链路压测项目需要对用户自定义线程池 Bean 进行适配工作,我们知道全链路压测的核心思想是对流量压测进行标记,因此我们需要给压测的流量请求进行打标,并在链路中进行传递,那么问题来了,如果项目中使用了多线…

基于Springboot外卖系统07:员工分页查询+ 分页插件配置+分页代码实现

1. 员工分页查询 1.1 需求分析 在分页查询页面中, 以分页的方式来展示列表数据,以及查询条件 "员工姓名"。 请求参数 搜索条件: 员工姓名(模糊查询) 分页条件: 每页展示条数 , 页码 响应数据 总记录数 结果列表 1…

1045-Access denied for user 'root'@'localhost'(using password:YES)

解决: 1. 开始 --> cmd --> net stop mysql (停用MySQL服务 没启动的可以省略) 2. 找到安装路径 MySQL Server 5.1下的my.ini 3. 打开 my.ini 找到 [mysqld] 然后在下面加上 这句: skip_grant_tables (意思好像是 启动MySQL服务…

arial字体可以商用吗_【工作总结】莫让字体版权引火上身

前段一条微软雅黑字体引发的巨额罚款新闻,引起国内多个TW大群小地震,人人自危。我也赶紧检查自家文档、商用出版物、网站的字体,以免给公司带来法务后患。把这两天收集的信息,采取的行动记录一下。哪些中文字体免费?事…

基于Springboot外卖系统08:员工账号状态管理功能+对象转换器+扩展Spring mvc的消息转换器

1. 员工账号状态管理 1.1 需求分析 在员工管理列表页面,可以对某个员工账号进行启用或者禁用操作。账号禁用的员工不能登录系统,启用后的员工可以正常登录。如果某个员工账号状态为正常,则按钮显示为 "禁用",如果员工…

Android init.rc 服务启动不成功

Android init.rc 服务启动不成功 问题 在开发过程中发现一个问题,我们需要在开机的时候判断硬件版本号去启动服务, 服务的名字是ledservice和ledservice4,但是发现每次烧录完固件后,服务启动不 成功,需要再复位重启一次&#xff0…

python爬虫什么网站都能爬吗_python如何爬取动态网站

python有许多库可以让我们很方便地编写网络爬虫,爬取某些页面,获得有价值的信息!但许多时候,爬虫取到的页面仅仅是一个静态的页面,即网页 的源代码,就像在浏览器上的“查看网页源代码”一样。一些动态的东西…

hdu4027Can you answer these queries?

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4027 区间&#xff08;单点&#xff09;更新&#xff0c;区间求和。 1 #include<cstdio>2 #include<algorithm>3 #include<cmath>4 #define lson l,m,rt<<15 #define rson m1,r,rt<…

基于Springboot外卖系统09:员工信息编辑+员工信息保存

1 编辑员工信息功能 1.1 需求分析 在员工管理列表页面点击 "编辑" 按钮&#xff0c;跳转到编辑页面&#xff0c;在编辑页面回显员工信息并进行修改&#xff0c;最后点击 "保存" 按钮完成编辑操作。 那么从上述的分析中&#xff0c;当前实现的编辑功能需…

共享资料

共享资料 请关注公众号 嵌入式Linux 索取posted on 2018-09-22 00:27 公众号&#xff1b;嵌入式Linux 阅读(...) 评论(...) 编辑 收藏

selenium-05-常见问题

一&#xff1a;日期控件 selenium不能直接对日期控件操作&#xff0c;可以通过js对日期控件做赋值操作 WebElement inputTimeBoxdriver.findElement(by.name("###")); //定位日期控件 Stringtime "2015/10/10"; ((JavascriptExecutor)driver).executeScri…

bcp 不能调用where 子句_MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!

不知道从什么时候开始&#xff0c;网上流传着这么一个说法&#xff1a;MySQL的WHERE子句中包含 IS NULL、IS NOT NULL、! 这些条件时便不能使用索引查询&#xff0c;只能使用全表扫描。这种说法愈演愈烈&#xff0c;甚至被很多同学奉为真理。咱啥话也不说&#xff0c;举个例子。…

基于Springboot外卖系统10:公共字段填充功能+ThreadLocal模块改进

1. 公共字段自动填充 1.1 问题分析 在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工时需要设置修改时间、修改人等字段。这些字段属于公共字段&#xff0c;也就是也就是在系统中很多表中都会有这些字段&#xff0c;如下&#xff1a; 而…

## __VA_ARGS__ ... 宏和可变参数

在GNU C中&#xff0c;宏可以接受可变数目的参数&#xff0c;就象函数一样&#xff0c;例如: 1 2 #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg) 用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参数表&#xff0c;如: 1 vo…

腾讯云挂在和格式化数据盘

新购买了数据盘时&#xff0c;需要格式化才可使用。未购买数据盘的用户可以跳过此步骤。也可以根据需要进行多分区操作。 这里以Windows 2012R2为例进行格式化说明。 1) 通过步骤四介绍的方法登录Windows云服务器。 2) 点击【开始】&#xff08;Start&#xff09;-【服务器管理…