最近项目换了新框架,改用SpringBoot了,虽然好用但有些东西还是很令人抓狂的。
在与前端对接的过程中出现了跨域的问题,首先想到的就是用拦截器去全局处理。但我的拦截器怎么配置都没有生效。以下是我的拦截器代码。
直接实现HandlerInterceptor接口
public class AccessInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("P3P", "CP=CAO PSA OUR");
if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
response.addHeader("Access-Control-Allow-Methods", "POST,GET,TRACE,OPTIONS");
response.addHeader("Access-Control-Allow-Headers", "Content-Type,Origin,Accept");
response.addHeader("Access-Control-Max-Age", "1000");
}
System.out.println("全局拦截器");
return true;
}
}
编写配置类将拦截器加进去 ,这里要加@Configuration,不然扫不进去
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AccessInterceptor())
.addPathPatterns("/**");
}
}
配到这里基本上已经完成了,我当时也是这么想的,能用了。结果还是不行。
经过我在网上反复查阅,发现要在启动类上加@ComponentScan注解
@MapperScan(basePackages = "com.cn.lejiao.mapper")
@ComponentScan(basePackages = {"com.cn.lejiao.interceptor"})
@SpringBootApplication(scanBasePackages = "com.cn.lejiao", exclude = DataSourceAutoConfiguration.class)
public class MhjServerSettleApp {
public static void main(String[] args) {
SpringApplication.run(MhjServerSettleApp.class, args);
}
}
到这里拦截器已经生效了,一测试发现接口访问不到了,404错误。我就很纳闷怎么问题一个接一个。后面又经过多方查找发现我这个@ComponentScan注解有问题。
@ComponentScan(basePackages = {"com.cn.lejiao.interceptor"})
我这里只把拦截器所在的包扫进去,controller , service 都没扫进去,稍加改动
@ComponentScan(basePackages = {"com.cn.lejiao"})
OK ,完工!
虽然只是小问题,我也写篇博客记录记录吧,希望遇到同样问题的同道看到这篇博客能快速解决。