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

完善登录功能--过滤器的使用

系列文章目录

Spring Boot读取配置文件内容的三种方式
Spring Boot自动配置–如何切换内置Web服务器
SpringBoot项目部署
上述为该系列部分文章,想了解更多可看我博客主页哦!


文章目录

  • 系列文章目录
  • 前言
  • 一、创建自定义过滤器LoginCheckFilter
  • 二、在启动类上加入注解@ServletComponentScan
  • 三、完善过滤器的处理逻辑
    • 3.1 获取本次请求的URI
    • 3.2 判断本次请求是否需要处理
    • 3.3 如果不需要处理,则直接放行
    • 3.4 判断登录状态,如果已登录,则直接放行
    • 3.5 未登录情况处理
  • 总结


前言

在我们实现完成登录校验功能后,当输入正确的用户名和密码就会跳转到首页,输入错误信息则不跳转首页。但是我们会发现不进行登录,直接在访问路径时直接访问首页的url路径也是可以访问的,就是不用输入用户名和密码也是可以访问首页的。那这样我们的登录功能做的就没有太大的意义。所以我们要进一步去拦截它,使得用户在不登录时访问不了其他的页面。这里就涉及到了今天的过滤器,当然拦截器也是可以实现的,我们这篇文章以过滤器为例来完善登录功能。使得用户在没有登录时访问其他页面时会自动跳回登录页面。


一、创建自定义过滤器LoginCheckFilter

首先要新建一个filter包,在filter包下创建LoginCheckFilter用来实现检查用户是否已经完成登录操作。
在该类上添加WebFilter注解(过滤的注解),里面的参数是filterName就是该过滤器的名字,urlPatterns是需要拦截的路径,这里因为是登录功能,所以我们urlPatterns = "/"表示拦截所有路径(“”通配符),在访问所有路径时都会进入这个函数进行逻辑处理。
然后实现Filter接口下的doFilter方法,将servletRequest、servletResponse强转为HttpServletRequest、HttpServletResponse用来后续做逻辑处理时会用到。
代码如下所示:

/**** 检查用户是否已经完成登录操作*/
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;}
}

二、在启动类上加入注解@ServletComponentScan

@ServletComponentScan注解用来扫描你创建的自定义过滤器LoginCheckFilter,所以要在启动类上加上该注解才会生效。
代码如下所示:

@Slf4j
@SpringBootApplication@ServletComponentScan
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class,args);log.info("项目启动成功...");}
}

三、完善过滤器的处理逻辑

我们上述两个步骤已经是做完了准备工作,但最核心的如何判断用户是否登录,以及用户在访问什么页面时需要阻止等逻辑代码还没有编写。所以下面我们就来编写逻辑代码。
在filter包下创建的自定义过滤器LoginCheckFilter中编写核心代码。

3.1 获取本次请求的URI

首先我们要获取用户当前访问页面的URI。“/employee/logout”返回的就是这样的路径。
代码如下:

String requestURI = request.getRequestURI();

然后我们要定义出哪些路径是需要放行的,比如用户访问登录页面、静态资源、用户退出等。我们用一个字符串数组存起来。

//直接放行的路径String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};

3.2 判断本次请求是否需要处理

如果是上述直接放行的路径我们则不需要处理,不是上述字符串数组中的URI我们就需要做进一步的处理。
但我们怎么判断是不是呢?
问题:字符串数组中有"/backend/**"的通配符写法,但我们获取到的URI是固定的写法,例如“/backend/index.html”。这样就不能直接用等号所对比。
解决:根据上述问题,我们就有一个spring自带的用来处理路径匹配的方法AntPathMatcher,可以自动的做上述的匹配操作。
所以我们先初始化代码,如下:

public static final AntPathMatcher PATH_MATCHER=new AntPathMatcher();

编写匹配的逻辑,这里我们将检查是不是需要放行的逻辑放到了一个函数里,如果需要放行就返回true,不放行就返回false(表示字符串数组中的URI没有与之相同的,我们需要拦截)。
代码如下:

public boolean check(String[] urls,String requestURI){for (String url : urls) {boolean match = PATH_MATCHER.match(url, requestURI);if(match){return true;}}return false;}

3.3 如果不需要处理,则直接放行

这里就是字符串数组中匹配到与之相对的URI,我们需要放行。
代码如下:

if(check){filterChain.doFilter(request,response);return;}

3.4 判断登录状态,如果已登录,则直接放行

如果用户是已经登录状态,那么当然可以访问首页等页面,所以我们直接放行。就是获取session,查看session中是否有值,null就表示用户没有登录。
代码如下:

if(request.getSession().getAttribute("employee")!=null){filterChain.doFilter(request,response);return;}

3.5 未登录情况处理

如果上述的条件都没有满足,那么就是用户未登录。
则返回未登录结果,通过输出流方式向客户端页面响应数据(因为前端写好了跳转路径,所以我们就只需要返回满足前端代码跳转路径的条件即可。这里为了解释清楚,我们看一下前端的写法。)
前端代码如下:

 	if (res.data.code === 0 && res.data.msg === 'NOTLOGIN') {// 返回登录页面console.log('---/backend/page/login/login.html---')localStorage.removeItem('userInfo')window.top.location.href = '/backend/page/login/login.html'} else {return res.data}

通过上述的js代码,我们了解到如果满足条件code=0,msg为“NOTLOGIN”则会返回登录页面。所以我们只需要返回一个JSON字符串格式的数据,数据值为code = 0 并且msg ='NOTLOGIN’即可。
java代码如下:
注:R是自定义的返回结果类,返回的数据就包含了上述的code、msg。

	response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));return;

总结

上述就是过滤器完善登录功能的全部代码以及实现流程了,这样我们在未登录时访问首页就会自动跳转至登录页面要求用户登录。
实现起来其实也不算很难,只要记住那些技术要点即可,例如路径匹配AntPathMatcher,加什么注解等。还有就是逻辑处理的部分,将思路理顺后一步一步编写代码,每一小步的代码实现起来也不难,但合起来的整个逻辑需要仔细的查看理解。
这次的文章到这里就结束了,我是心态还需努力呀。我们下篇文章再见!

相关文章:

完善登录功能--过滤器的使用

系列文章目录 Spring Boot读取配置文件内容的三种方式 Spring Boot自动配置–如何切换内置Web服务器 SpringBoot项目部署 上述为该系列部分文章,想了解更多可看我博客主页哦! 文章目录系列文章目录前言一、创建自定义过滤器LoginCheckFilter二、在启动类…...

CSS基础:属性和关系选择器

字体属性 color 文本颜色 div{ color:red;} div{ color:#ff0000;} div{ color:rgb(255,0,0);} div{ color:rgba(255,0,0,.5);}font-size 文本大小 h1 {font-size:40px;} h2 {font-size:30px;} p {font-size:14px;}注意:chrome浏览器接受最小字体是12px font-we…...

设计模式:原型模式解决对象创建成本大问题

一、问题场景 现在有一只猫tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom猫属性完全相同的10只猫。 二、传统解决方案 public class Cat {private String name;private int age;private String color;…...

驱动开发(二)

一、驱动流程 驱动需要以下几个步骤才能完成对硬件的访问和操作&#xff1a; 模块加载函数 module_init注册主次设备号 <应用程序通过设备号找到设备>驱动设备文件 <应用程序访问驱动的方式> 1、手动创建 &#xff08;mknod&#xff09;2、程序自动创建file_oper…...

《狂飙》大结局,这22句经典台词值得细品

最近爆火的热播剧《狂飙》大家都看了吗&#xff1f; 剧情紧凑、演技炸裂、豆瓣评分9.0&#xff0c;可以说是开年评分最高的一部国产剧。 ​ 虽然大结局了。 里面有很多经典台词&#xff0c;值得每个人细细品味。 01 这世界不缺梦想 有本事你就去实现它 02 你这么善良 怎么跟坏…...

【计算机网络期末复习】第二章 物理层

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为想复习学校计算机网络课程的同学提供重点大纲&#xff0c;帮助大家渡过期末考~ &#x1f4da;专栏地址&#xff1a; ❤️如果有收获的话&#xff0c;欢迎点…...

多核异构核间通信-mailbox/RPMsg 介绍及实验

1. 多核异构核间通信 由于MP157是一款多核异构的芯片&#xff0c;其中既包含的高性能的A7核及实时性强的M4内核&#xff0c;那么这两种处理器在工作时&#xff0c;怎么互相协调配合呢&#xff1f; 这就涉及到了核间通信的概念了。 IPCC (inter-processor communication contr…...

【Rust日报】2023-02-11 从头开始构建云数据库 RisingWave - 为什么我们从 C++ 转向 Rust...

GTK4发布v0.60gtk4-rs代码库包含GTK4的Rust crates。还有个庞大的GObject库生态系统&#xff0c;其中许多库基于gtk-rs中包含的Rust绑定工具。 特别是&#xff1a;gtk-rs-core&#xff0c;一些核心库的绑定&#xff0c;例如 glib、gio、pango、graphenegstreamer-rs&#xff0c…...

Linux驱动开发(一)

linux驱动学习记录 一、背景 在开始学习我的linux驱动之旅之前&#xff0c;先提一下题外话&#xff0c;我是一个c语言应用层开发工作人员&#xff0c;在工作当中往往会和硬件直接进行数据的交互&#xff0c;往往遇到数据不通的情况&#xff0c;常常难以定位&#xff0c;而恰巧…...

Spring MVC 之返回数据(静态页面、非静态页面、JSON对象、请求转发与请求重定向)

文章目录1. 默认情况下返回静态页面2. 返回一个非静态页面的数据2.1 ResponseBody 返回页面内容2.2 RestController ResponseBody Controller3. 实现登录功能&#xff0c;返回 JSON 对象3.1 前端使⽤ ajax&#xff0c;后端返回 json 给前端3.2 前端发送 JSON 的标准格式4. 请…...

leetcode-每日一题-2335(简单,贪心)

自己打表看一下过程就可以发现&#xff0c;其实就是每次选两个大的进行--之后秒数加1即可现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。给你一个下标从 0 开始、长度为 3 的整数数组 amount &am…...

Verilog语法之数学函数

Verilog-2005支持一些简单的数学函数&#xff0c;其参数的数据类型只能是integer和real型。 Integer型数学函数 $clog2是一个以2为底的对数函数&#xff0c;其结果向上取整&#xff0c;返回值典型的格式&#xff1a; integer result; result $clog2(n); 最典型的应用就是通过…...

【手撕面试题】JavaScript(高频知识点一)

目录 面试官&#xff1a;请你简述 var、let、const 三者之间的区别&#xff1f; 面试官&#xff1a;请你谈谈对深拷贝与浅拷贝的理解 面试官&#xff1a;输入URL的那一瞬间浏览器做了什么&#xff1f; 面试官&#xff1a;说一说cookie sessionStorage localStorage 区别&am…...

如何用PHP实现消息推送

什么是消息推送 通过服务器自动推送消息到客户端(浏览器&#xff0c;APP&#xff0c;微信)的应用技术。 2. 为什么要使用消息推送技术 通常情况下都是用户发送请求浏览器显示用户需要的信息。推送技术通过自动传送信息给用户&#xff0c;来减少用于网络上搜索的时间。它根据…...

电子学会2020年6月青少年软件编程(图形化)等级考试试卷(四级)答案解析

青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;四级A卷&#xff09; 分数&#xff1a;100.00 题数&#xff1a;30 一、单选题&#xff08;共15题&#xff0c;每题2分&#xff0c;共30分&#xff09; 1. 执行下图程序后&#xff0c;“花名…...

DaVinci:调色版本

调色版本 Grade Version记录着片段的全部调色信息。将一种调色风格或效果&#xff0c;保存为一个调色版本&#xff0c;从而可在多个调色版本之间查看、比较、挑选或者渲染输出。调色版本类型本地版本Local Versions在没有创建新的调色版本之前&#xff0c;片段的调色信息默认记…...

【C++初阶】十二、STL---反向迭代器的实现

目录 一、反向迭代器 二、反向迭代器的实现 一、反向迭代器 之前的模拟实现vector、list 的时候&#xff0c;这些都是实现了正向迭代器&#xff0c;反向迭代器都没有实现&#xff0c;这里就要实现反向迭代器 反向迭代器也是适配器&#xff08;配接器&#xff09;的一种&#…...

day 43|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…...

[SSD固态硬盘技术 0] SSD的结构和原理导论

版权声明&#xff1a; 本文禁止转载机械硬盘的存储系统由于内部结构,其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展&#xff0c;性能瓶颈得到缓解。1. 什么是SSD固态硬盘&#xff08;Solid State Drives&#xf…...

Vue (3)

文章目录1. 数据代理1.1 回顾1.2 开始2. 事件处理2.1 v-on:click 点击事件2.2 事件修饰符2.3 键盘事件3. 计算属性3.1 插值语法实现3.2 methods实现3.3 计算属性实现4. 监视属性4.1 深度监视4.2 监视属性的简写形式4.3 watch 与 computed 对比1. 数据代理 在学习 数据代理 时 先…...

Linux Deadline 调度器的动态参数调整:运行时的参数更新

简介在传统 Linux 调度体系中&#xff0c;CFS 普通进程、SCHED_FIFO/SCHED_RR 实时进程一旦创建&#xff0c;调度优先级、时间片等参数大多只能通过用户态接口静态设置&#xff0c;运行过程中无法动态变更。而SCHED_DEADLINE作为 Linux 内核原生硬实时调度策略&#xff0c;最大…...

Spring Boot 缓存优化:从入门到精通

Spring Boot 缓存优化&#xff1a;从入门到精通 核心概念 缓存是提高应用性能的重要手段&#xff0c;Spring Boot 提供了强大的缓存支持。通过合理配置和使用缓存&#xff0c;可以显著减少数据库访问次数&#xff0c;提高响应速度。 Spring Boot 缓存抽象 Spring Boot 提供了统…...

基于MCP协议的AI智能体实时金融数据工具箱Tickerr详解

1. 项目概述&#xff1a;一个为AI智能体打造的实时金融数据工具箱最近在折腾AI智能体&#xff08;Agent&#xff09;开发&#xff0c;特别是想让它们能处理一些实时性要求高的任务&#xff0c;比如监控股票价格、追踪新闻动态。我发现&#xff0c;要让一个智能体真正“理解”并…...

故障诊断涨点改进|全网独家复现,水平可见图 + 图卷积创新改进篇引入 HVG+GCN,时序拓扑融合助力机械故障诊断、弱特征提取、强噪声鲁棒性有效涨点(PyTorch)

目录 一、创新背景与核心痛点 1.1 传统故障诊断的核心瓶颈 1.2 HVGGCN创新思路&#xff08;全网独家融合方案&#xff09; 二、核心原理详解&#xff08;HVGGCN关键机制&#xff09; 2.1 HVG&#xff08;水平可见图&#xff09;原理与实现 2.2 GCN&#xff08;图卷积网络…...

[具身智能-611]:常见传感器的接口类型与传感器数据的内容:模拟电压、温湿度、流量传感器、IMU、舵机、激光雷达等

按类别整理&#xff1a;模拟电压、温湿度、流量、IMU、舵机、激光雷达、距离、姿态、总线传感器&#xff0c;每个都讲清&#xff1a;接口形式、物理线序、通信协议、输出什么数据。统一前置规则&#xff1a;主控一律 3.3V 电平&#xff0c;传感器大多兼容 3.3V/5V&#xff1b;所…...

视频时间管理大师:用这款工具让你的学习效率翻倍

视频时间管理大师&#xff1a;用这款工具让你的学习效率翻倍 【免费下载链接】videospeed HTML5 video speed controller (for Google Chrome) 项目地址: https://gitcode.com/gh_mirrors/vi/videospeed 你是否曾有过这样的经历&#xff1f;在线学习时&#xff0c;老师的…...

纯Go实现Llama大模型推理引擎:llama.go架构解析与部署实践

1. 项目概述与核心价值最近在折腾大语言模型本地部署和推理时&#xff0c;发现了一个挺有意思的项目——gitctrlx/llama.go。简单来说&#xff0c;这是一个用纯Go语言实现的Llama系列大模型推理引擎。如果你和我一样&#xff0c;对在本地跑大模型感兴趣&#xff0c;但又不想被P…...

Java企业级RAG引擎MaxKB4j:基于Spring Boot与虚拟线程构建智能问答系统

1. 项目概述&#xff1a;为什么我们需要一个Java原生的企业级智能问答引擎&#xff1f;如果你是一名Java后端工程师&#xff0c;或者你所在的技术团队主要技术栈是Java&#xff0c;那么在过去一年里&#xff0c;你可能和我一样&#xff0c;被一个现实问题困扰着&#xff1a;当老…...

基于Next.js 13与OpenAI API构建AI编程助手全栈实践

1. 项目概述&#xff1a;打造一个属于你自己的AI编程助手最近在折腾一个挺有意思的项目&#xff0c;想和大家分享一下。这个项目的核心&#xff0c;就是利用OpenAI的Codex模型&#xff08;也就是ChatGPT背后技术的一个分支&#xff09;&#xff0c;自己动手搭建一个专属于开发者…...

CANN/hcomm通信域初始化

HcclCommInitRootInfo 【免费下载链接】hcomm HCOMM&#xff08;Huawei Communication&#xff09;是HCCL的通信基础库&#xff0c;提供通信域以及通信资源的管理能力。 项目地址: https://gitcode.com/cann/hcomm 产品支持情况 Ascend 950PR/Ascend 950DT&#xff1a;…...