Filter使用方法
//定義一個自己的過濾器,實現Filter接口
public class MyFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
//在請求之前進行過濾
System.out.println("before");
//返回過濾器鏈,繼續通過下一個過濾器
//如果此處不想繼續執行,可以直接return,不用繼續doFilter
chain.doFilter(req, res);
//請求結束之後
System.out.println("after");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
<!-- web.xml配置文件,配置filter和filter-mapping,name要對應 -->
<!-- 可以配置多個filter-mapping,只需要name與filter對應即可 -->
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
結果
SpringMvc攔截器使用方法
//實現HandlerInterceptor,需要實現三個方法
//也可以繼承HandlerInterceptorAdapter,preHandle默認返回true
//根據需要重寫自己的方法
public class MyInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("視圖渲染後");
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("請求處理後,視圖渲染前");
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {
System.out.println("請求處理前");
return true;
}
}
配置文件的配置
<mvc:interceptors>
<mvc:interceptor>
<!-- 攔截路徑,這裏表示攔截所有 -->
<mvc:mapping path="/**" />
<bean class="cn.edu.hbue.soft.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
結果
以下引用https://www.cnblogs.com/panxuejun/p/7715917.html
Filter可以攔截所有請求,在請求前後進行處理
Interceptor只能攔截經過前端控制器的請求,在具體的controller前後進行處理,只要一個pre返回true了,直接到after
Filter基於回調,Interceptor基於反射
這就是基於回調,這裏的Code1和Code2實際上就是自己寫的攔截器的doFilter
Chain.doFilter調用MyFitler.doFilter,然後MyFilter.doFilter反過來又調用Chain.doFilter
在這個過程中執行了service方法