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方法