1.添加拦截器
package com.example.saina.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定义拦截器
* 自定义拦截器后,需要配置进Spring
*
* @author dh
* @since 2023/02/07
*/
public class TokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//跨域请求会首先发一个option请求,直接返回正常状态并通过拦截器
if (request.getMethod().equals("OPTIONS")) {
response.setStatus(HttpServletResponse.SC_OK);
return true;
}
/**
* 可以在此处添加校验
*/
return false;
}
}
2.添加过滤器,过滤不需要拦截的路径
package com.example.saina.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* TokenInterceptor 自定义拦截器后,需要配置进Spring
* 也可以mapping,跨域设置
* @author dh
*
* @since 2023/02/07
*/
@Configuration //表明这个类是一个配置类,继承WebMvcConfigurer
public class TokenConfig implements WebMvcConfigurer {
//添加跨域设置
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.maxAge(1800)
.allowedOriginPatterns("*");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> excludePath = new ArrayList<>();
//这里用来排除拦截的接口,例如登录前调用的接口
excludePath.add("/api/login/**"); //登录
registry.addInterceptor(new TokenInterceptor()) // 注册拦截器
.addPathPatterns("/**")
.excludePathPatterns(excludePath);
WebMvcConfigurer.super.addInterceptors(registry);
}
}
3.解决拦截器配置后不生效问题
启动类上添加包扫描配置
@ComponentScan(basePackages={"com.example.saina.interceptor"})
4.通过拦截器后,无法正常调用controller接口
可能出现的原因是:添加包扫描后,未扫描到controller下代码
启动类配置添加
@ComponentScan(basePackages={"com.example.saina.interceptor","com.example.saina.controller","com.example.saina.service"})