最近重构公司项目发现之前项目中有很多的拦截配置,用的大部分都是shiro进行拦截,将项目升级成boot项目之后试着shiro的方式半天,后来发现boot项目自带拦截,有点捡来芝麻丢了西瓜的感觉,好了废话不多说之间上代码:
1、继承 WebMvcConfigurerAdapter 实现方法
WebMvcConfigurerAdapter配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,Spring 5.0 以后WebMvcConfigurerAdapter会取消掉
以下WebMvcConfigurerAdapter 比较常用的重写接口
/** 解决跨域问题 **/ public void addCorsMappings(CorsRegistry registry) ;
/** 添加拦截器 **/ void addInterceptors(InterceptorRegistry registry);
/** 这里配置视图解析器 **/ void configureViewResolvers(ViewResolverRegistry registry);
/** 配置内容裁决的一些选项 **/ void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 视图跳转控制器 **/ void addViewControllers(ViewControllerRegistry registry);
/** 静态资源处理 **/ void addResourceHandlers(ResourceHandlerRegistry registry);
/** 默认静态资源处理器 **/ void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
新的版本解决方案目前有两种: 方案1 直接实现WebMvcConfigurer @Configuration public class WebMvcConfg implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/index").setViewName("index"); } } 方案2 直接继承WebMvcConfigurationSupport @Configuration public class WebMvcConfg extends WebMvcConfigurationSupport { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/index").setViewName("index"); } } 个人推荐使用第一种 /** * 跨域配置 允许所以请求进来,可根据需求配置 * @param registry */ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedHeaders("*") .allowedMethods("*") .allowedOrigins("*") .maxAge(3628800) .allowCredentials(true); }
/** * 拦截器配置 拦截所需要拦截的请求,走addInterceptor内new的方法校验 * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry){ if(!devWithoutInterception) { registry.addInterceptor(new UserInterceptor()) .addPathPatterns("/user/*.do", "/order/*.do") .excludePathPatterns("/common/*.do", "/wechat/*.do"); registry.addInterceptor(new WebRequestInterceptor()) .addPathPatterns("/html/*.do") .excludePathPatterns("/common/*.do"); } }
/** * FilterRegistrationBean * 用来配置urlpattern * 来确定哪些路径触发filter * order 顺序 */ @Bean public FilterRegistrationBean someFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new DecryptFilter()); registration.addUrlPatterns("/user/*","/order/*"); registration.setOrder(1); return registration; }
/** * 配置微信访问拦截 * @return */ @Bean public ServletRegistrationBean indexServletRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean(new AccessTokenServlet()); registration.addUrlMappings("/AccessTokenServlet"); registration.addInitParameter("appId",wxappid); registration.addInitParameter("appSecret",wxappSecret); return registration; }
/** * 在Springboot程序启动后,会默认添加OrderedCharacterEncodingFilter和HiddenHttpMethodFilter过滤器。 * 在HiddenHttpMethodFilter过滤器中会调用request.getParameter(), * 从而造成我们在controller中通过request的InputStream无法读取到RequestBody的数据 * @return */ @Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter() { return new OrderedHiddenHttpMethodFilter(){ @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { filterChain.doFilter(request, response); } }; }
以上部分原创其余则是参考别人敬请谅解。