【SpringBoot】_统一功能处理:拦截器

news/2025/2/21 23:58:14

目录

1. 拦截器基本原理

2. 定义拦截器

3. 注册配置拦截器

3.1 后端

3.2 前端


1. 拦截器基本原理

1、拦截器是Spring的核心功能之一,主要用于拦截用户的请求,在指定方法前后根据业务需要,执行预先设定好的代码。

2、使用拦截器的步骤:

(1)定义拦截器;(2)注册配置拦截器;

2. 定义拦截器

以登录拦截器为例,创建一个interceptor的包,并在其下创建LoginInterceptor类表示注册拦截器:

java">package com.example.bookmanagementsystem.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
    // 目标方法执行前执行
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        log.info("目标方法执行前");
        return true;
    }
}

1、定义拦截器时,需要实现HandlerInterceptor接口;

2、定义拦截器时,根据需要重写preHandle方法、postHandle方法和afterCompletion方法:

(1)preHandle方法在目标方法执行前执行,返回类型为boolean类型,

若返回true,表示放行,继续后续操作;

若返回false,表示拦截成功

(2)postHandle方法在目标方法执行后执行;

(3)afterCompletion方法在视图渲染完毕后执行(但后端目前不涉及视图开发);

3. 注册配置拦截器

3.1 后端

创建config包,并在其下创建WebConfig类用于注册配置拦截器:

java">package com.example.bookmanagementsystem.config;

import com.example.bookmanagementsystem.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Arrays;
import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    private static List<String> excludePath= Arrays.asList("/User/login",
            "/css/**",
            "/js/**",
            "/pic/**",
            "/**/*.html");

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//       拦截内容: /**表示给所有方法添加拦截器
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns(excludePath);
    }
}

1、用于注册配置拦截器的类需要实现WebMvcConfigurer接口,该接口是一个MVC配置器;

2、在配置拦截器时,常使用的两个方法是addPathPatterns和excludePathPatterns两个方法:

其中:addPathPatterns方法用于指明需要拦截的路径,

excludePathPatterns方法用于排除的路径

3、关于路径的写法:

拦截路径含义举例
/*⼀级路径
能匹配/User,/Book,/login,不能匹配 /User/login
/**任意级路径
能匹配/User,/User/login,/User/reg
/Book/*
/Book下的⼀级路径
能匹配/Book/addBook,不能匹配/Book/addBook/1,/Book
/Book/**/Book下的任意级路径
能匹配/Book,/Book/addBook,/Book/addBook/2,不能匹
配/User/login

4、关于excludePathPatterns方法的参数:

参数可以是若干个String类型变量,也可以是一个元素为String的List集合;

3.2 前端

在book_list.html中对应success执行函数再编写error执行函数:

java"><script>
            getBookList();
            function getBookList() {
                $.ajax({
                    url:"/Book/getBookListByPage"+location.search,
                    // location.search获取当前url的查询字符串
                    type:"get",
                    success:function(result){
                        if(result.code=="UNLOGIN"){
                            location.href="login.html"
                        }
                        var pageResult=result.data;
                        var finalHtml="";
                        // 加载列表
                        // 根据每一条记录拼接HTML,即一个<tr>
                        for(var book of pageResult.records){
                            finalHtml+='<tr>';
                            finalHtml+='<td><input type="checkbox" name="selectBook" value="'+book.id+'" id="selectBook" class="book-select"></td>';
                            finalHtml+='<td>'+book.id+'</td>';
                            finalHtml+='<td>'+book.bookName+'</td>';
                            finalHtml+='<td>'+book.author+'</td>';
                            finalHtml+='<td>'+book.count+'</td>';
                            finalHtml+='<td>'+book.price+'</td>';
                            finalHtml+='<td>'+book.publish+'</td>';
                            finalHtml+='<td>'+book.statusCN+'</td>';
                            finalHtml+='<td>';
                            finalHtml+='<div class="op">';
                            finalHtml+='<a href="book_update.html?bookId='+book.id+'">修改</a>';
                            finalHtml+='<a href="javascript:void(0)" onclick="deleteBook('+book.id+')">删除</a>';
                            finalHtml+='</div>';
                            finalHtml+=' <td>';
                            finalHtml+=' <tr>';
                        }
                        $("tbody").html(finalHtml)

                        //翻页信息
                        $("#pageContainer").jqPaginator({
                            totalCounts: pageResult.total, //总记录数
                            pageSize: 7,    //每页的个数
                            visiblePages: 5, //可视页数
                            currentPage: pageResult.pageRequest.currentPage,  //当前页码
                            first: '<li class="page-item"><a class="page-link">首页</a></li>',
                            prev: '<li class="page-item"><a class="page-link" href="javascript:void(0);">上一页<\/a><\/li>',
                            next: '<li class="page-item"><a class="page-link" href="javascript:void(0);">下一页<\/a><\/li>',
                            last: '<li class="page-item"><a class="page-link" href="javascript:void(0);">最后一页<\/a><\/li>',
                            page: '<li class="page-item"><a class="page-link" href="javascript:void(0);">{{page}}<\/a><\/li>',
                            //页面初始化和页码点击时都会执行
                            onPageChange: function (page, type) {
                                console.log("第"+page+"页, 类型:"+type);
                                if(type=="change"){
                                    location.href="book_list.html?currentPage="+page;
                                }
                            }
                        });
                    },
                    error:function(error){
                        console.log(error);
                        if(error.status==401){
                            location.href="login.html";
                        }
                    }
                });
            }

        </script>

http://www.niftyadmin.cn/n/5861438.html

相关文章

项目中一些不理解的问题

1.Mybatis是干啥的 他是用来帮我们操作数据库的&#xff0c;相当于是我们的一个助手&#xff1a; 我们想要得到数据库中的什么数据&#xff0c;就可以告诉mybatis&#xff0c;他会给我们想要的结果&#xff0c;同时&#xff0c;我们想要对数据库做出什么操作&#xff0c;也可…

自动化网页检测提醒

自动化网页检测提醒 一、前言 随着网页动态化技术的普及&#xff0c;许多关键信息&#xff08;如新闻公告、商品价格、库存状态等&#xff09;会实时更新。手动监控效率低下且易遗漏&#xff0c;本方案通过自动化监测智能提醒&#xff0c;实现对指定网页区域的实时监控&#…

LLM的MoE架构的“动态路由”为什么能训练出来?

互联网各领域资料分享专区(不定期更新): Sheet 正文 大型语言模型(MoE)架构中的“动态路由”之所以能够被有效训练,关键在于其设计融合了可微分的路由机制、专家协同优化以及负载均衡约束。以下是具体原因和技术原理的解析: 一、动态路由的可微分性与端到端优化 门控网络…

如何理解什么是股指期货?

股指期货&#xff0c;简单来说&#xff0c;就是一种以股票指数为标的的期货合约。就好比你和朋友打赌&#xff0c;赌某个股票指数未来的价格会涨还是会跌。比如&#xff0c;现在沪深300指数是4000点&#xff0c;你和朋友约定&#xff0c;一个月后这个指数会涨到4100点&#xff…

了解几个 HTML 标签属性,实现优化页面加载性能

引言 当浏览器解析 HTML 文档时&#xff0c;如果遇到一个普通的脚本标签&#xff08;不带 async 或 defer 属性&#xff09;&#xff0c;浏览器会立即下载并执行该脚本&#xff0c;同时阻塞 HTML 解析过程。这意味着&#xff0c;如果脚本文件较大或者网络连接较慢&#xff0c;…

深入浅出Java虚拟机(JVM)核心原理

目录 一、JVM概述 1.1 大白话理解JVM 1.2 JVM架构 1.3 跨平台运行的本质 二、类加载器 1.1 类加载全过程 1.1.1 加载阶段 1.1.2 验证阶段 1.1.3 准备阶段 2.2 双亲委派机制 2.3 自定义类加载器 三、运行时数据区 3.1 堆内存结构 3.1.1 新生代参数优化 3.1.2 内存…

机器学习小项目之鸢尾花分类

项目目标&#xff1a; 使用机器学习算法&#xff08;如 K-近邻算法&#xff09;来对鸢尾花数据集进行分类。 1. 准备工作 首先&#xff0c;我们需要安装一些常用的机器学习库&#xff0c;如 scikit-learn 和 pandas。 pip install scikit-learn pandas matplotlib2. 导入必…

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体&#xff0c;当输入的值为负数时&#xff0c;会自动显示红色字体&#xff0c;对于数值或者金额输入时该功能就非常有用了。 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.co…