springboot 入门八-自定义配置信息(编码、拦截器、静态资源等)
若想实际自定义相关配置,只需要继承WebMvcConfigurerAdapter。WebMvcConfigurerAdapter定义些空方法用来重写项目需要用到的WebMvcConfigure实现。具体写法如下:
@Configuration
public class BootConfig extends WebMvcConfigurerAdapter
@Configuration表示这是Java配置类;
一、编码配置
在springmvc中使用在web.xml添加过滤器。
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在springboot中只需要要配置类中注入过滤器
@Bean
public Filter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
}
二、拦截器interceptor
Interceptor是链式调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。每个Interceptor 的调用会依据它的声明顺序依次执行。自定义拦截器需要实现HandlerInterceptor接口,重写三个方法preHandle、postHandle、afterCompletion。
preHandle(): 在业务处理器处理请求之前被调用。可以在这个方法中进行一些判断来决定请求是否要继续进行下去,返回boolean类型,返回false,表示请求结束,后续的Interceptor 和Controller都不会再执行
postHandle(): 在当前请求进行处理之后。
afterCompletion(): 是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。即完成整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
如:
public class BootInterceptor implements HandlerInterceptor {
@Autowired
private MemberService memberService;
........
}
如果拦截器中使用到其它类的调用,必需要对拦截器加入spring bean容器中管理。加入bean容器,需要使用@Bean注解,@Bean表示一种方法,产生一个bean的方法,并且交给Spring容器管理。
在自定义配置类中的写法:
@Bean
public BootInterceptor bootInterceptor() {
return new BootInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(bootInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
super.addInterceptors(registry);
}
三、定义方法跳转
在部分业务中,会出现跳转但又没任何具体的业务内容。
1、定义个controller方法处理跳转
2、springMVC中在xml配置文件中加入
<mvc:view-controller path="/vc" view-name="index"/>
<mvc:view-controller path="/vcr" view-name="redirect:index"/>
<mvc:redirect-view-controller redirect-url="index" path="/rvc"/>
3、springboot在定制的配置类中,重写addViewControllers即可
@Override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/login").setViewName("login");
}
四、静态资源
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/h/**").addResourceLocations("classpath:/html/");
}
此配置比拦截器优先级要高,不需要经过拦截器。
五、CORS 跨域请求支持
跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,它允许您以灵活的方式指定哪些跨域请求被授权,而不是使用诸如IFRAME或JSONP之类的安全性较弱的方法。可以配置全局的规则,也可以使用@CrossOrigin注解进行细粒度的配置。
CORS与JSONP相比
1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").maxAge(3000).allowCredentials(false);
}