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

posted @   emanlee  阅读(284)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2012-12-28 Retrieving COM for CLSID {00024500-0000-0000-C000-000000000046} 80040154.
2009-12-28 iDeneb can't see any drive to install
2009-12-28 Run Mac OS X on a PC
2009-12-28 Mac OS could not mount diskXX with name after erase
2008-12-28 CSS+DIV 完美实现垂直居中的方法
2007-12-28 2008毕业设计-毕业设计需要了解的信息
点击右上角即可分享
微信分享提示