1. 拦截器的作用及使用场景
能够在请求的生命周期的不同阶段进行拦截和处理。常见的使用场景包括:
1. 日志记录:记录请求和响应的日志。
2. 权限验证:检查用户的登录状态、权限。
3. 性能监控:记录请求的处理时间,监控性能。
4. 请求参数验证:校验请求参数的合法性。
5. 跨域处理:解决跨域请求的问题。
6. 国际化处理:根据用户语言设置返回不同的响应。
7. Session 管理:检查用户的 Session 状态。
8. 异常处理:捕获并处理全局异常。
2. 拦截器的使用
HandlerInterceptor:
所有自定义拦截器或 Spring Boot 提供的拦截器的鼻祖
preHandle():
当某个 URL 已经匹配到对应的 Controller 中的某个方法,且在这个方法执行之前执行。
所以 preHandle() 方法可以决定是否将请求放行,这是通过返回值来决定的,返回 true 则放行,
返回 false 则不会向后执行。
postHandle():
当某个 URL 已经匹配到对应的 Controller 中的某个方法,且在执行完了该方法执行,
但是在DispatcherServlet 视图渲染之前。所以在这个方法中有个 ModelAndView 参数,可以在此做
一些修改动作。
afterCompletion():
该方法是在整个请求处理完成后(包括视图渲染)执行,这时做一些资源的清理工作,
这个方法只有在 preHandle() 被成功执行后并且返回 true 才会被执行。
3. 创建拦截器
SpringBoot2前:WebMvcConfigurerAdapter
SpringBoot2后:WebMvcConfigurationSupport
@Autowired:引入自定义拦截器
addResourceHandlers():配置静态资源的,比如html,js,css
addInterceptors() :用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
package com.itestmini.testplatformbackend.config.intercepors;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* @author moso
* @Date 2024/12/24 22:45
* 拦截器
*/
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 设置response的字符编码为UTF-8
response.setCharacterEncoding("UTF-8");
// 设置contentType为text/html,并指定UTF-8编码
response.setContentType("text/html;charset=UTF-8");
log.info("===preHandle===");
log.info("===request.getRequestURI===" + request.getRequestURI());
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
log.info("===postHandle===");
log.info("===request.getRequestURI===" + request.getRequestURI());
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
log.info("===afterCompletion ===");
log.info("===request.getRequestURI===" + request.getRequestURI());
}
}
4. 配置拦截器
package com.itestmini.testplatformbackend.config;
import com.itestmini.testplatformbackend.config.intercepors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.nio.charset.Charset;
import java.util.List;
/**
* @author moso
* @Date 2024/12/24 22:51
* 配置拦截器
*/
@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport {
@Autowired
private LoginInterceptor loginInterceptor;
// 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
.excludePathPatterns("","");//可以添加url,对应的url不会进行拦截器校验,例如/itest/login
}
}
5. 拦截器使用
调用登录接口,对应的日志:
https://gitee.com/moso520/test-platform-backend.git
f5e005a