spring boot設置過濾器、監(jiān)聽器及攔截器的方法
前言
其實這篇文章算不上是springboot的東西,我們在spring普通項目中也是可以直接使用的
設置過濾器:
以前在普通項目中我們要在web.xml中進行filter的配置,但是只從servlet 3.0后,我們就可以在直接在項目中進行filter的設置,因為她提供了一個注解@WebFilter(在javax.servlet.annotation包下),使用這個注解我們就可以進行filter的設置了,同時也解決了我們使用springboot項目沒有web.xml的尷尬,使用方法如下所示
@WebFilter(urlPatterns="/*",filterName="corsFilter", asyncSupported = true)
public class CorsFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse)servletResponse;
HttpServletRequest request = (HttpServletRequest)servletRequest;
chain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
其實在WebFilter注解中有一些屬性我們需要進行設置, 比如value、urlPatterns,這兩個屬性其實都是一樣的作用,都是為了設置攔截路徑,asyncSupported這個屬性是設置配置的filter是否支持異步響應,默認是不支持的,如果我們的項目需要進行請求的異步響應,請求經(jīng)過了filter,那么這個filter的asyncSupported屬性必須設置為true不然請求的時候會報異常。
設置攔截器:
編寫一個配置類,繼承org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter或者org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport并重寫addInterceptors(InterceptorRegistry registry)方法,其實父類的addInterceptors(InterceptorRegistry registry)方法就是個空方法。使用方法如下:
@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
});
// 配置攔截路徑
registration.addPathPatterns("/**");
// 配置不進行攔截的路徑
registration.excludePathPatterns("/static/**");
}
}
配置監(jiān)聽器:
一般我們常用的就是request級別的javax.servlet.ServletRequestListener和session級別的javax.servlet.http.HttpSessionListener,下面以ServletRequestListener為例,編寫一個類實現(xiàn)ServletRequestListener接口并實現(xiàn)requestInitialized(ServletRequestEvent event)方法和requestDestroyed(ServletRequestEvent event)方法,在實現(xiàn)類上加上@WebListener(javax.servlet.annotation包下),如下所示
@WebListener
public class RequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("請求結束");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("請求開始");
}
}
這樣每一個請求都會被監(jiān)聽到,在請求處理前equestInitialized(ServletRequestEvent event)方法,在請求結束后調(diào)用requestDestroyed(ServletRequestEvent event)方法,其實在spring中有一個非常好的例子,就是org.springframework.web.context.request.RequestContextListener類
public class RequestContextListener implements ServletRequestListener {
private static final String REQUEST_ATTRIBUTES_ATTRIBUTE =
RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";
@Override
public void requestInitialized(ServletRequestEvent requestEvent) {
if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
throw new IllegalArgumentException(
"Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
}
HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();
ServletRequestAttributes attributes = new ServletRequestAttributes(request);
request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
LocaleContextHolder.setLocale(request.getLocale());
RequestContextHolder.setRequestAttributes(attributes);
}
@Override
public void requestDestroyed(ServletRequestEvent requestEvent) {
ServletRequestAttributes attributes = null;
Object reqAttr = requestEvent.getServletRequest().getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE);
if (reqAttr instanceof ServletRequestAttributes) {
attributes = (ServletRequestAttributes) reqAttr;
}
RequestAttributes threadAttributes = RequestContextHolder.getRequestAttributes();
if (threadAttributes != null) {
// We're assumably within the original request thread...
LocaleContextHolder.resetLocaleContext();
RequestContextHolder.resetRequestAttributes();
if (attributes == null && threadAttributes instanceof ServletRequestAttributes) {
attributes = (ServletRequestAttributes) threadAttributes;
}
}
if (attributes != null) {
attributes.requestCompleted();
}
}
}
在這個類中,spring將每一個請求開始前都將請求進行了一次封裝并設置了一個threadLocal,這樣我們在請求處理的任何地方都可以通過這個threadLocal獲取到請求對象,好處當然是有的啦,比如我們在service層需要用到request的時候,可以不需要調(diào)用者傳request對象給我們,我們可以通過一個工具類就可以獲取,豈不美哉。
擴充:在springboot的啟動類中我們可以添加一些ApplicationListener監(jiān)聽器,例如:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(DemoApplication.class);
application.addListeners(new ApplicationListener<ApplicationEvent>() {
@Override
public void onApplicationEvent(ApplicationEvent event) {
System.err.println(event.toString());
}
});
application.run(args);
}
}
ApplicationEvent是一個抽象類,她的子類有很多比如ServletRequestHandledEvent(發(fā)生請求事件的時候觸發(fā))、ApplicationStartedEvent(應用開始前觸發(fā),做一些啟動準備工作)、ContextRefreshedEvent(容器初始化結束后觸發(fā)),其他還有很多,這里不再多說,但是這些ApplicationListener只能在springboot項目以main方法啟動的時候才會生效,也就是說項目要打jar包時才適用,如果打war包,放在Tomcat等web容器中是沒有效果的。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
Java 8 開發(fā)的 Mybatis 注解代碼生成工具
MybatisAnnotationTools 是基于 Java8 開發(fā)的一款可以用于自動化生成 MyBatis 注解類的工具,支持配置數(shù)據(jù)源、類路徑,表名去前綴、指定類名前后綴等功能.這篇文章主要介紹了Java 8 開發(fā)的 Mybatis 注解代碼生成工具 ,需要的朋友可以參考下2019-07-07
如何使用Comparator比較接口實現(xiàn)ArrayList集合排序
這篇文章主要介紹了如何使用Comparator比較接口實現(xiàn)ArrayList集合排序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
在Windows系統(tǒng)下安裝Thrift的方法與使用講解
今天小編就為大家分享一篇關于在Windows系統(tǒng)下安裝Thrift的方法與使用講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

