常识必备
拦截器与过滤器的区别
区别 | 过滤器Filter | 拦截器Interceptor |
---|---|---|
使用范围 | 是servlet规范中的一部分,任何Javaweb工程都可以使用 | 是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用 |
拦截范围 | 在url-pattern中配置了/*之后,可以对所有要访问的资源拦截 | 在url-pattern中配置了/*之后,可以对所有要访问的资源拦截 |
废话少说,直接上代码!
源码解读:HandlerInterceptor是一个接口,共有三个方法。
public interface HandlerInterceptor { //接口,可供类实现
//在目标方法执行之前,执行
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true; //默认为true,返回true代表放行,false代表不放行
}
//在目标方法执行之后,视图对象返回之前执行
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
//在流程都执行完毕后,执行
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
应用场景:自定义拦截器,权限控制
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取Session域中的用户名
Object loginUser = request.getSession().getAttribute("loginUser");
//如果没有登录
if(loginUser==null){
request.setAttribute("msg","没有权限,请先登录");
//请求转发
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else{
return true;
}
}
}
拦截器方法总结
方法名 | 说明 |
---|---|
preHandle() | 方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行,当返回值为true时就会继续调用下一个Interceptor的preHandle方法 |
postHandle() | 该方法是在当前请求进行处理之后被调用,前提是preHandle方法的返回值为true时才能被调用,且它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作 |
afterCompletion() | 该方法将在整个请求结束之后,也就是在DIspatcherServlet渲染了对应的视图之后执行,前提是preHandle方法的返回值为true时才能被调用 |
本人正在打造技术交流群,欢迎志同道合的朋友一起探讨,一起努力,通过自己的努力,在技术岗位这条道路上走的更远。群号:914683950 备注:技术交流 即可通过!