目录
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>