前两天写了一篇文章,是关于在springboot 下使用swagger 文档框架的,当初只是为了学习,在环境搭建好了之后,一调试就可以了。
但是在今天实际项目开发时,因为项目开发实际用到了前后端分离,所以不可避免的使用到了拦截器解决跨域问题。
拦截器代码如下:
public class CorsInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception{
String origin = httpServletRequest.getHeader("Origin");
System.out.println("this is origin: "+origin);
httpServletResponse.setHeader("Access-Control-Allow-Origin", origin);
httpServletResponse.setHeader("Access-Control-Allow-Methods", "*");
httpServletResponse.setHeader("Access-Control-Allow-Headers","Origin,Content-Type,Accept,token,X-Requested-With");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
return true;
}
}
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new CorsInterceptor())
.addPathPatterns("/**");
}
再添加后跨域拦截器后发现再次访问swagger-ui.html时出现错误,这是因为在拦截器中把这些请求拦截了,所以无法访问。
解决办法为:在继承了WebMvcConfigurationSupport的类中添加代码使其忽视关于swagger-ui的拦截。最终代码为
@Configuration
public class CorsConfig extends WebMvcConfigurationSupport {
/**
* 添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new CorsInterceptor())
.addPathPatterns("/**");
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}