SpringBoot-过滤器的使用(在访问页面时过滤掉未登录的用户使其不能访问相应页面)

news2025/1/13 2:35:15

目录

概述

前端编写

页面展示

后端编写

编写接口

过滤器的编写

过滤器功能实验


 

概述

解决需求:在用户未登录的情况下访问未登录不可访问的页面时,请求将被过滤到,将用户退回登录页面。

技术选型

前端:Vue + ElementUI

后端:SpringBoot + MyBatisPlus

说明

1.本篇博客不真正连接后台数据库,以及仅做粗糙的前端页面做演示,重点说明的是登录请求过滤器使用,以及实现当未登录用户访问非登录页面时将返回到登录页面的功能完善。

2.如果仅想了解过滤器的书写形式和用法,可以在目录点击"过滤器的编写"查看,不必看完全部篇章的实验细节。


前端编写

页面展示

说明:页面仅做两个简易的页面作为演示,一个是登录页面,一个是管理页面(未登录访问将退回登录页面)。 

 登录页面 

 d65d788d38bf4afe83cb489eca5c4f74.png

 当点击"登录按钮时,会向后台登录接口发送一个请求",验证账号和密码是否匹配成功,当匹配成功后将session添加上,代表为登录状态。

代码片段:

<script>
    //获取DOM节点
    let loginBtn = document.querySelector("#loginBtn"); // 登录按钮
    let idInput = document.querySelector("#id"); // 账号输入框
    let passwordInput = document.querySelector("#password"); // 密码输入框

    loginBtn.addEventListener("click",function (){
        //获取输入框id和password
        let id = idInput.value;
        let password = passwordInput.value;
        // 发送请求
        axios.post("/logins?id="+id+"&password="+password).then(function (res){
            //判断后端响应信息登录状态提示是否为:“登录成功”
            if (res.data === "登录成功"){
                // 登录成功,页面跳转到数据管理页面
                window.location = "/manage.html"
            }else {
                alert("账号密码不匹配")
            }
        })
    })

</script>

说明:代码中的接口下面会有代码编写片段,已经提前准备好。

 管理页面 

ad25007dc893485f9b4ce92549d043ce.png

访问此页面,当vue数据加载完毕后,会自动执行钩子函数mount(),在其中向后台接口发送请求,获取分页数据,当前页面的"王*虎"是虚拟数据,并不是真实的从后台获取的数据,分页接口就是模拟向后台发送请求获取真实的数据。并且获取返回值提示,判断是否获取到真实数据。

 代码片段

6ce86288a9cf496888d02a6511fea36f.png

后端编写

实验中后台编写就是需要编写接口和过滤器,接口是为了向前端提供请求路径,给过滤器过滤这些请求,用以判断用户在访问管理页面时是否登录过。 

编写接口

需求分析

1.登录接口:我们需要提供当用户点击登录后访问登录接口,将session添加上,代表用户登录了。

2.获取分页数据接口,当访问到管理页面时,后台钩子函数会自动向分页接口发送请求获取数据在页面进行展示,此接口作用:做为拦截的请求。

说明:登录接口中不向后台数据库真实验证账号密码,提供虚拟数据进行验证作为演示,获取分页数据接口中不向数据库真实获取分页数据,仅向后台发送请求作为演示,作为可以被过滤到的请求,过滤到后如果未登录就退回登录页面。

登录接口

@RestController
@ResponseBody
@RequestMapping("/logins")
@Slf4j
public class LoginController {

    /**
     * 判断ID和密码是否匹配,匹配成功登录成功
     * @param id 账号
     * @param password 密码
     * @param httpServletRequest 用户操作session
     * @return 返回登录提示
     */
    @PostMapping
    public String loginCheck(int id, String password, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse){
        log.info("id:{}<--->password{}",id,password);
        //设置虚拟ID和密码(在此模拟数据库中的登录数据)
        int myId = 1;
        String myPassword = "aa";

        //判断传入id和password是否和虚拟登录数据匹配(仅作演示,真实情况需要访问数据库进行匹配验证)
        if (id == myId && password.equals(myPassword)){
            //登录数据匹配,登录成功
            //将session添加上(登录成功的标志)
            httpServletRequest.getSession().setAttribute("login","ok");
            return "登录成功";
        }

        return "登录失败";
    }
}

获取分页数据接口

@RestController
@RequestMapping("/users")
@Slf4j
public class UserController {

    /**
     * 模拟获取分页数据
     * @return 返回提示信息
     */
    @GetMapping
    public String returnPageData(){
        log.info("分页数据请求...");
        return "我是模拟数据";
    }
}

过滤器的编写

经过上面的实验演示,当我们在登录页面输入正确的账号密码登录成功后,后台会为用户添加上session,以作为登录过的标志,并且自动跳转到数据管理页面,但是如果用户未登录,直接通过url访问数据管理页面,这时也是可以访问成功的。这并不符合我们的预期。

过滤器编写步骤

1.启动类添加注解@servletComponentScan

2.创建自定义过滤器类并完善过滤逻辑

过滤逻辑

1.当用户访问登录页面时,或登录检验等类似请求时,我们选择直接放行。

2.当用户访问的不是直接放行的请求,那么我们检查用户的session,判断用户使用登录过,如果有session,那么我们放行,否则退回登录页面。

代码实现一:添加注解

@SpringBootApplication
// 程序组件扫描,用于扫描到我们的自定义过滤器
@ServletComponentScan
public class BlogLoginFilterApplication {
    public static void main(String[] args) {
        SpringApplication.run(BlogLoginFilterApplication.class, args);
    }
}

代码实现二:编写自定义过滤器

package com.mh.filter;

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;

/**
 * Date:2023/1/25
 * author:zmh
 * description: 自定义登录过滤器
 **/
// 定义过滤器名称和定义过滤路径
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter { // 实现javax.servlet下的Filter

    //1.定义路径匹配器--用于下方的checkPath()方法匹配请求路径和放行路径是否存在匹配(固定写法)。
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

    // 重写其中的doFilter方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //2.将参数servlet转为http形式,因为下面要操作session
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //3.获取当前访问的URL,用以判断是否直接放行
        String requestURI = request.getRequestURI();
        log.info("当前的URI是:{}",requestURI);

        //4.定义直接放行的资源请求(根据自己实际情况定义放行的资源)
        String[] urls = new String[]{
                //登录页面的请求
                "/logins",
                //下方访问静态页面可以放行,但是在静态页面发送的分页数据请求是会过滤的
                //例如:当一访问manege页面就会请求获取分页数据,就会向/users发送
                //请求,然会就会进行登录检查
                "/element-ui/**",
                "/html/**",
                "/JS/**",
                "/favicon.ico"
        };

        //步骤5在最下面(定义方法)
        //6.检查当前请求是否需要进行过滤(true代表匹配成功,直接放行)
        if(checkPath(urls,requestURI)){
            //如果匹配成功,则放行
            filterChain.doFilter(request,response);
            log.info("资源直接放行...");
            return;
        }

        //7.捕获到需要过滤的请求,检查是否有登录后赋予的session(检查是否已登录)
        if(request.getSession().getAttribute("login") != null){ //“login”是登录接口定义的session名
            filterChain.doFilter(request,response);
            log.info("用户已登录...");
            return;
        }

        //8.如果无session,登录失败,可以给予前端一些提示
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("请先登录");
        log.info("请求过滤成功,登录失败...");
    }

    //5.定义路径匹配方法,传入放行请求路径数组和当前请求路径进行匹配。
    /**
     * 路径匹配方法
     * @param urls 需要放行的请求路径数组
     * @param targetUrl 需要检查的请求路径
     * @return 返回是否匹配成功
     */
    private Boolean checkPath(String[] urls,String targetUrl){
        for (String url : urls) {
            if (PATH_MATCHER.match(url, targetUrl)){
                return true;
            }
        }
        return false;
    }
}

过滤器功能实验

我们知道,当用户在未登录的情况下直接访问"数据管理页面",我们是不允许访问此页面的以及此页面中的"真实数据"的(王大虎,王小虎这些属于虚拟数据并不是从后台获取的数据)。

如果我们在登录后访问"据管理页面",那么我们就会看到真实从后台返回的数据,但是因为在此做的是模拟操作,只要在访问"数据管理页面"后就会向接口/users发送请求获取分页数据,如果未登录(无session)那么向接口/users的请求就不会被过滤器放行,后台的日志就输出提示并且前端页面退回登录页面,反之登录后,有了session代表已经登录,那么请求会被放行,后台会有相应提示,相当于是模拟了从后台获取数据给到了前端。

但在此并不向后台获取真实数据,仅做模拟,因此不向前端表格中做渲染了。

 未登录时直接访问“数据管理页面”

617159c5e5164542b2b0f4439808d97d.png

会看到请求"/users"被过滤器过滤了,请求"/users"并没有进入方法体,因此不会返回"我是模拟数据"字符串,导致前端页面自动跳转到登录页面,因为如果进入了控制台会有相应提示,再看看接口中的定义:

13de819b1da24a049ea86e2b137c86fc.png

 我们输入正确账号密码登录,自动跳转到数据管理页面

2213abf8a4614b1e95d2693fdb89da37.png

 可以看到图中红框,登陆后请求被放行,确实是从后台获取到了数据。

在登录的情况下直接访问数据管理页面

7870189e3a044c09be4b93c301b0e127.png

 可以看到,因为登录过了存在session,所以请求也会被过滤器放行,获取到了分页数据。

 

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

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

相关文章

MySQL事务的四大特性以及并发事务问题

事务的四大特性ACID 【原子性&#xff08;Atomicity&#xff09;】&#xff1a;事务是不可分割的最小单元&#xff0c;要么全部成功&#xff0c;要么全部失败。&#xff08;eg&#xff1a;转账案例&#xff0c;转账过程中任何一步操作失败了&#xff0c;那么整个事务就失败了&a…

Python装饰器使用方法详解

文章目录1 装饰器背景知识1.1 基本概念1.2 应用场景2 简单的装饰器代码3 使用装饰器记录函数执行次数4 带参数的装饰器5 装饰器处理有返回值的函数1 装饰器背景知识 1.1 基本概念 装饰器&#xff08;Decorator&#xff09;是 Python 中一种函数或类&#xff0c;用来修饰其他函…

RabbitMQ部署

RabbitMQ部署1.单机部署1.1.下载镜像1.2.安装MQ1.3访问管理端2.集群部署2.1.集群分类2.2.设置网络1.单机部署 我们在Centos7虚拟机中使用Docker来安装&#xff0c;如未安装dockr&#xff0c;请参考《Centos7安装Docker》 1.1.下载镜像 方式一&#xff1a;在线拉取 docker …

C语言linux线程库pthread的简单使用教程

POSIX线程&#xff08;pthread&#xff09;库 POSIX线程库是用于C/C的基于标准的线程API。它允许产生一个新的并发流程。它在多处理器或多核系统上最为有效&#xff0c;在这些系统中&#xff0c;可以将流程安排在另一个处理器上运行&#xff0c;从而通过并行或分布式处理提高速…

flask框架全解

文章目录简介wsgiref安装配置文件方式一&#xff08;debug方式配置&#xff09;方式二&#xff08;环境变量方式&#xff0c;很少见&#xff09;方式三&#xff08;配置文件方式&#xff09;其他配置方式flask app路由组成写法动态路由的过滤查询字符串传参json和form等数据反向…

deepin系统如何安装惠普打印机

deepin系统如何安装惠普打印机 导读 想必现在有很多小伙伴对于deepin系统如何安装惠普打印机 安装惠普打印机的方法方面的知识都比较想要了解&#xff0c;那么今天小好小编就为大家… 想必现在有很多小伙伴对于deepin系统如何安装惠普p1007打印机 安装惠普打印机的方法方面的知…

【图卷积神经网络】02-谱域图卷积介绍

注&#xff1a;本文为第2章谱域图卷积介绍视频笔记&#xff0c;仅供个人学习使用 目录1、图卷积简介1.1 图卷积网络的迅猛发展1.2 回顾&#xff0c;经典卷积神经网络已在多个领域取得成功1.3 两大类数据1.4 经典卷积神经网络的局限&#xff1a;无法处理图数据结构1.5 将卷积扩展…

Python学习基础之快速入门

目录 首先我们下载最新的python版本&#xff1a;3.0 编写一个hello world 什么是python里面的IPO python运行有几种模式 编写一个温度转换器 在windows上执行python程序 官网&#xff1a;Welcome to Python.org Python 是一门易于学习、功能强大的编程语言。它提供了高效的…

保护视力台灯是白光还是暖光?盘点专业护眼的暖光护眼台灯

保护视力的灯光颜色是最接近太阳光最好&#xff0c;而白光与暖光主要是色温来控制的&#xff0c;低色温&#xff08;3000K以下&#xff09;&#xff0c;中性色温&#xff08;4000K左右&#xff09;&#xff0c;高色温&#xff08;5000K以上&#xff09;&#xff0c;低色温的光源…

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher) 请访问原文链接&#xff1a;https://sysin.org/blog/install-macos-13-on-unsupported-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.s…

RabbitMQ入门与应用

RabbitMQ入门与应用1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比&#xff1a;2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结3.SpringAMQP3.1.Basic Queue 简单队列模型3…

python机器学习数据建模与分析——pandas中常用函数总结

本文主要对数据建模与分析中常使用到的pandas内置函数进行总结分析&#xff0c;以此来熟悉数据建模与分析的流程。 文章目录一、Pandas数据结构1.1 数据结构—Series1.1.1 Series的创建方式1.1.2 使用索引和获取数据1.2 数据结构—DataFrame1.2.1 DataFrame的创建方式1.2.2 使用…

变速积分PID算法及仿真

在普通的PID 控制算法中&#xff0c;由于积分系数k是常数&#xff0c;所以在整个控制过程中&#xff0c;积分增量不变。而系统对积分项的要求是&#xff0c;系统偏差大时积分作用应减弱甚至全无&#xff0c;而在偏差小时则应加强。积分系数取大了会产生超调&#xff0c;甚至积分…

强化学习笔记:基于价值的学习之价值迭代(python实现)

目录 1. 前言 2. 数学原理 3. 实现 3.1 Planner类 3.2 ValueIterationPlanner类 4. 运行结果及分析 1. 前言 在强化学习中&#xff0c;根据是否依赖于&#xff08;环境的&#xff09;模型&#xff0c;可以分为有模型&#xff08;model-based&#xff09;…

通信原理简明教程 | 模拟调制传输

文章目录1 模拟幅度调制1.1 模拟幅度调制的基本原理1.2 DSB-SC调制和AM调制1.3 SSB调制和VSB调制2 模拟角度调制2.1 角度调制的基本概念2.2 窄带调频和宽带调频2.3 调频信号的产生方法3 模拟调制系统的解调3.1 相干解调3.2 非相干解调4 模拟调制系统的抗噪声性能4.1 抗噪声性能…

Service Mesh

Service Mesh 参考如下文章&#xff1a;可以将此文章看作为下面文章的结合&#xff1a; https://zhuanlan.zhihu.com/p/61901608 https://philcalcado.com/2017/08/03/pattern_service_mesh.html https://zhuanlan.zhihu.com/p/153105848?from_voters_pagetrue 微服务演化进…

浅谈 开源许可证

目录浅谈 开源许可证一、什么是开源许可证1.1 什么是开源1.2 什么是开源许可证Copyleft 许可证&#xff08;Copyleft 许可证&#xff09;宽松许可证&#xff08;permissive 许可证&#xff09;二、为什么要有开源许可证2.1、No License&#xff1a;没有开源许可证意味着什么2.2…

38.Isaac教程--AprilTags

AprilTags ISAAC教程合集地址文章目录AprilTags源码Isaac Codelet运行示例应用程序在主机系统上运行示例应用程序在 Jetson 上运行应用程序在 Websight 中查看应用程序的输出AprilTags 是一种流行的基准标记形式。 它在机器人技术中有广泛的应用&#xff0c;包括对象跟踪、视觉…

数据挖掘领域十大经典算法

一、什么是数据挖掘&#xff1f;数据挖掘是人工智能和数据库领域研究的热点问题&#xff0c;所谓数据挖掘是指从数据库的大量数据中揭示出隐含的、先前未知的并有潜在价值的信息的非平凡过程。数据挖掘是一种决策支持过程&#xff0c;它主要基于人工智能、机器学习、模式识别、…

蓝桥杯STM32G431RBT6学习——USART

蓝桥杯STM32G431RBT6学习——USART 前言 串口在蓝桥杯近几届中考频也相对较高&#xff08;十三、十二届均考&#xff09;&#xff0c;因此必然也要学习一下。 作为后来之秀的开源项目DAP Link不仅支持SWD调试下载&#xff0c;同时还支持串口调试功能&#xff0c;国信长天开…