• Spring MVC HandlerInterceptorAdapter 拦截器


    拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。

    1.拦截器(Interceptor)执行顺序:

    1) 请求到达 DispatcherServlet
    2 DispatcherServlet 发送至 Interceptor ,执行 preHandle
    3 请求达到 Controller
    4 请求结束后,postHandle 执行


    2.拦截器(Interceptor)和过滤器(Filter)的执行顺序

    过滤前 -> 拦截前 -> Action处理 -> 拦截后 -> 过滤后


    3.使用方法

    1)预处理 preHandle()方法

    用户发送请求时,先执行 preHandle()方法。会先按照顺序执行所有拦截器的 preHandle方法,一直遇到return false为止,
    比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则执行用户请求的url方法。


    2)后处理 postHandle()方法

    调用了Service并返回ModelAndView,但未进行页面渲染,可以在这里继续修改ModelAndView

    3)返回处理 afterCompletion()方法

    已经渲染了页面,在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

    注:一般使用preHandle这个拦截器进行预处理,对url进行请求拦截。


    HandlerInterceptorAdapter 使用示例:
    根据用户是否已经登录,用户的角色,判断用户是否可以访问某些页面。
    /**
     * 资源拦截器
     */
    public class ResourcesInterceptor extends HandlerInterceptorAdapter {
        //任意角色都能访问的路径
        private List<String> ignoreUrl;
        public ResourcesInterceptor(List<String> ignoreUrl) {
            this.ignoreUrl = ignoreUrl;
        }
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
                Exception {
            User user = (User) request.getSession().getAttribute("USER_SESSION");
            //获取请求的路径
            String uri = request.getRequestURI();
            //如果用户是已登录状态,判断访问的资源是否有权限
            if (user != null) {
                //如果角色是管理员,放行
                if ("ADMIN".equals(user.getRole())) {
                    return true;
                }
                //如果是普通用户
                else if (!"ADMIN".equals(user.getRole())) {
                    for (String url : ignoreUrl) {
                        //访问的资源不是管理员权限的资源,放行
                        if (uri.indexOf(url) >= 0) {
                            return true;
                        }
                    }
                }
            }
            //对用户登录的相关请求,放行
            if (uri.indexOf("login") >= 0) {
                return true;
            }
            //其他情况都直接跳转到登录页面
            request.setAttribute("msg", "您还没有登录,请先登录!");
            request.getRequestDispatcher("/admin/login.jsp").forward(request, response);
            return false;
        }
    }

    REF

    https://blog.csdn.net/kuishao1314aa/article/details/109777304

    https://www.cnblogs.com/EasonJim/p/7704740.html

  • 相关阅读:
    扩展AuthorizeAttribute
    扩展ValidationAttribute 1
    动态linq to list排序
    CSS属性书写顺序及命名规则
    增强网站可访问性的25种方法
    -webkit-filter是神马?
    docker安装
    docker的体系结构
    docker和虚拟化
    初识docker——docker基本概述
  • 原文地址:https://www.cnblogs.com/emanlee/p/15742882.html
Copyright © 2020-2023  润新知