Spring Boot (教程八: 過濾器、監聽器、攔截器)
阿新 • • 發佈:2019-01-31
GitHub 地址:
過濾器Filter
在src下建立com.example.filter包
- 建立 ServletFilter.java 實現 Filter 方法
package com.example.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/**
* Servlet Filter implementation class ServletFilter
* 註解註冊過濾器:實現 javax.servlet.Filter介面
* filterName 是過濾器的名字
* urlPatterns 是需要過濾的請求 ,這裡只過濾servlet/* 下面的所有請求
*/
@WebFilter(filterName="ServletFilter",urlPatterns="/servlet/*" )
public class ServletFilter implements Filter {
/**
* Default constructor.
*/
public ServletFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
System.out.println("過濾器被銷燬。");
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("過濾器正在執行...");
// pass the request along the filter chain
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("初始化過濾器。");
}
}
測試
控制檯輸出:
監聽器Listener
在src下建立com.example.listener包
- 建立 ContextListener.java 類
package com.example.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* Application Lifecycle Listener implementation class ContextListener
* @author LingDu
*/
@WebListener
public class ContextListener implements ServletContextListener {
/**
* Default constructor.
*/
public ContextListener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("監聽器被銷燬");
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("監聽器初始化。");
}
}
專案啟動的時候 監聽器是先被初始化的
攔截器Interceptor
建立攔截器
在src下建立com.example.interceptor包,
建立MyInterceptor.java類,實現HandlerInterceptor介面,重寫裡面3個主要的方法。
- MyInterceptor.java
package com.example.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 1、建立攔截器類並實現 HandlerInterceptor 介面
* @author LingDu
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("攔截器MyInterceptor------->3、請求結束之後被呼叫,主要用於清理工作。");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("攔截器MyInterceptor------->2、請求之後呼叫,在檢視渲染之前,也就是Controller方法呼叫之後");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("攔截器MyInterceptor------->1、請求之前呼叫,也就是Controller方法呼叫之前。");
return true;//返回true則繼續向下執行,返回false則取消當前請求
}
}
註冊攔截器
在src下建立com.example.interceptor包
建立InterceptorConfigurerAdapter類,繼承WebMvcConfigurerAdapter類,重寫addInterceptors方法
- InterceptorConfigurerAdapter.java
注意:需要加上@Configuration註解
package com.example.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 建立java類繼承WebMvcConfigurerAdapter類,重寫addInterceptors方法
* @author LingDu
*/
@Configuration
public class InterceptorConfigurerAdapter extends WebMvcConfigurerAdapter {
/**
* 該方法用於註冊攔截器
* 可註冊多個攔截器,多個攔截器組成一個攔截器鏈
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 新增路徑
// excludePathPatterns 排除路徑
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*.*");
super.addInterceptors(registry);
}
}
頁面訪問:
成功攔截: