自定义一个拦截器,拦截指定路径的请求
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Datetime 2024年12月25日 16:39
* @ClassName: UserDeptInfoInterceptor
* @Description: TODO 拦截器
* @Version 1.0
*/
@Slf4j
@Component
@CrossOrigin
public class UserDeptInfoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception{
log.info("在请求处理之前进行调用(即 Controller 方法执行之前)");
log.info("检查用户的登录状态、权限检查、请求日志等");
//允许跨域
response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
//该字段可选,是个布尔值,表示是否可以携带cookie
response.setHeader("Access-Control-Allow-Credentials", "true");
//允许的请求方法
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT,PATCH, DELETE, OPTIONS");
//允许header携带
response.setHeader("Access-Control-Allow-Headers", "*");
// 权限检查或日志记录
if (request.getSession().getAttribute("user") == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception{
//
log.info("可以在这里修改模型数据");
if (modelAndView != null) {
modelAndView.addObject("additionalInfo", "some additional data");
}
}
@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler,Exception ex)throws Exception{
// 执行清理工作,记录日志,统计请求耗时等
long endTime = System.currentTimeMillis();
log.info("方法结束时间{}",endTime);
}
}
如果我们要使用这个拦截器的话 还需要将它注册到SpringMVC的配置中
import com.rococo.config.interceptor.UserDeptInfoInterceptor;
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;
/**
* @Datetime 2024年12月25日 17:19
* @ClassName: WebConfig
* @Description: TODO web配置类,用于注册自定义的拦截器
* @Version 1.0
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
UserDeptInfoInterceptor userDeptInfoInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(userDeptInfoInterceptor)
.addPathPatterns("/api/**") //拦截/api/开头的请求
.excludePathPatterns("/acc/**"); //开放/acc/开头的请求
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.
addResourceHandler("/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
.resourceChain(false);
}
}
关于 Swagger 配置:
在 addResourceHandlers
方法中,为 /swagger-ui/**
配置了静态资源处理规则
这个配置确保了请求路径 /swagger-ui/**
会直接被 Spring MVC 处理为静态资源请求,不会受到 userDeptInfoInteceptor
拦截器的干扰。所以即使请求路径不是 /api/**
开头的,也不会影响访问 Swagger UI 资源。