这个是不久前在面试的时分遇到的一个成绩,事先直接懵了,两个单拎出来,虽然不太完全,但都大约知道可以对央求停止阻拦,放在一同比较,可真是头疼。
其实之前面试完就去学习了一波,只不过那个时分没及时总结,如今总结一下,以免日后遇到这类成绩又给忘咯。
要了解这类成绩,光靠融会贯串能够事先有用,过一阵子就差不多忘了。要想真的牢记,我们必需要实操一下。
Filter的运用
首先,要运用Filter,必须完成javax.servlet.Filter接口:
public interface Filter {
//web运用加载进容器,Filter对象创立之后,执行init办法初始化,用于加载资源,只执行一次。
public default void init(FilterConfig filterConfig) throws ServletException {}
//每次央求或照应被阻拦时执行,可执行屡次。
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
//web运用移除容器,效劳器被正常封锁,则执行destroy办法,用于释放资源,只执行一次。
public default void destroy() {}
}
init和destroy是default办法,完成类可以不用完成。
doFilter必须完成,也就是说,作为一个过滤器,doFilter必需要定义。
doFlilter办法中传出去的FilterChain对象用来调用下一个过滤器。
阻拦器的运用
public interface HandlerInterceptor {
//阻拦handler的执行 --> 在HanlerMapping决议适宜的handler之后,[在HandlerAdater调用handler之前执行。]
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception { return true;
} //阻拦handler的执行 --> [在HandlerAdapter调用handler之后],在DispatcherServlet渲染视图之前执行
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception { } //视图渲染后调用,且只要preHandle结果为true,才会调用
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception { }}
//DispatcherServlet
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return; //遍历一切的interceptors,调用preHandle办法,只要前往true,才能停止下去
}
// 这里也就是处置Contrller
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//视图渲染
applyDefaultViewName(processedRequest, mv);
//视图渲染之后调用
mappedHandler.applyPostHandle(processedRequest, response, mv);
过滤器与阻拦器究竟有啥区别呢?
一、完成原理不同
过滤器的完成基于回调函数
阻拦器基于Java的反射机制【静态代理】完成。
二、运用范围不同
过滤器是Servlet的标准,需求完成javax.servlet.Filter接口,Filter运用需求依赖于Tomcat等容器。
阻拦器是Spring组件,定义在org.springframework.web.servlet包下,由Spring容器管理【又有愈加丰厚的生缪那个周期处置办法,细粒度,且可以运用Spring中的资源】,不依赖Tomcat等容器。
三、触发机遇不同
这一段在HandlerInterceptor类的注释上可以发现,两者的触发机遇是不同的:
过滤器:对央求在进入后Servlet之前或之后停止处置。
(责任编辑:admin)