问题: 启动项目后, 无法打开 swagger 页面.
这是因为项目中使用了自定义拦截技术.不过此处的拦截器代码是核心包提供的,不是在项目中实现的(关键字在项目中全局搜不到).
当我们需要是否登陆、权限认证、数据校验、预先设置数据以及统计方法的执行效率就可以使用拦截器
Springboot中的拦截技术主要包含两种方式.一个是 HandlerInterceptor,一个是 MethodInterceptor。
HandlerInterceptor用于拦截 controller 即 URL 当外部调用你的地址时执行拦截器逻辑
MethodInterceptor 用于拦截每个方法 不一定是 controller 方法 可以精细到每个方法
spring有个aop切面功能 就是可以指定某些路径的代码绑定 绑定后只要调用这些方法 就会触发拦截器逻辑
HandlerInterceptor 实现
此项目中 DocIntercept extends BaseIntercept implements HandlerInterceptor
preHandle中可以看到业务逻辑: 特定URL直接跳过判断,否则执行docService的check方法.如果异常则重定向到图1的页面.
自定义拦截器写完后需要注册才能生效.
项目中配置类SpringBootConfigurer extends WebMvcConfigurationSupport,addInterceptors中注册了各种拦截器.
因此如果要跳过此图1页面,需要在此处下手.
HandlerInterceptor Demo
extends WebMvcConfigurationSupport 会导致 WebMvcAutoConfiguration失效 进而无法访问所有页面
Demo项目中采用实现WebMvcConfigurer接口的方式
http://192.168.200.39:999/zhaojun/wudiboot.git
两个核心类:
com.wudi.config.SpringBootConfigurer
com.wudi.intercepter.TestIntercepter
WebMvcConfigurationSupport 引申
WebMvcConfigurationSupport 主要方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| configurePathMatch:配置路由请求规则 configureContentNegotiation:内容协商配置 configureAsyncSupport configureDefaultServletHandling:默认静态资源处理器 addFormatters:注册自定义转化器 addInterceptors:拦截器配置 addResourceHandlers:资源处理 addCorsMappings:CORS配置 addViewControllers:视图跳转控制器 configureViewResolvers:配置视图解析 addArgumentResolvers:添加自定义方法参数处理器 addReturnValueHandlers:添加自定义返回结果处理器 configureMessageConverters:配置消息转换器。重载会覆盖默认注册的HttpMessageConverter extendMessageConverters:配置消息转换器。仅添加一个自定义的HttpMessageConverter. configureHandlerExceptionResolvers:配置异常转换器 extendHandlerExceptionResolvers:添加异常转化器 getValidator getMessageCodesResolver
|
用的最多的是
1 2 3 4 5 6 7 8 9
| public void addCorsMappings(CorsRegistry registry) ;
void addInterceptors(InterceptorRegistry registry);
void addResourceHandlers(ResourceHandlerRegistry registry);
|
其中跨域问题处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @Configuration public class AddCorsMappings extends WebMvcConfigurationSupport {
@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") .allowCredentials(true) .allowedHeaders("*") .maxAge(3600); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public class CustomInterceptor implements HandlerInterceptor {
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return HandlerInterceptor.super.preHandle(request, response, handler); }
@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); }
@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
|
MethodInterceptor 这个项目没用到 下回学到再说