• Spring中的拦截器HandlerInterceptor


    常识必备
    拦截器与过滤器的区别

    区别过滤器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 {
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    应用场景:自定义拦截器,权限控制

    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;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    拦截器方法总结

    方法名说明
    preHandle()方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行,当返回值为true时就会继续调用下一个Interceptor的preHandle方法
    postHandle()该方法是在当前请求进行处理之后被调用,前提是preHandle方法的返回值为true时才能被调用,且它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作
    afterCompletion()该方法将在整个请求结束之后,也就是在DIspatcherServlet渲染了对应的视图之后执行,前提是preHandle方法的返回值为true时才能被调用

    本人正在打造技术交流群,欢迎志同道合的朋友一起探讨,一起努力,通过自己的努力,在技术岗位这条道路上走的更远。群号:914683950 备注:技术交流 即可通过!

  • 相关阅读:
    前端代码规范
    【ES6知识】ESModule 模块化
    阿里云服务器企业级和入门级实例规格有何区别?如何选择?
    腾讯mini项目-【指标监控服务重构】2023-08-17
    分析服务用多维度、多场景的用户分层,带您深度玩转精细化游戏运营
    3款超实用的电脑软件,免费又良心,内存满了也绝不卸载
    Java14新增特性
    大数据-之LibrA数据库系统告警处理(ALM-12050 网络写吞吐率超过阈值)
    [论文阅读]A ConvNet for the 2020s
    新C++(1):命名空间\函数重载\引用\内联函数
  • 原文地址:https://blog.csdn.net/m0_52110974/article/details/133655225