若想實際自定義相關配置,只需要繼承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);
}