SpringBoot拦截器HandlerInterceptor

本文介绍SpringBoot中的HandlerInterceptor(拦截器),重点讲解其实现方式与应用场景,包括登录验证、权限控制等,并提供具体代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HandlerInterceptor是什么?
Spring Boot 拦截器主要应用于登陆校验、权限验证、乱码解决,同样提供了拦截器功能。
二、使用方式
在项目中实现HandlerInterceptor接口开箱即用
三、HandlerInterceptor 中实现的方法

方法介绍
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。(返回true,false
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。 (无返回值
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。(无返回值

四、程序中使用


@Component
public class MenuUnauthorizedInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, 
            HttpSession session = request.getSession();
            Object roleid = session.getAttribute("roleid");
            String requestURI = request.getRequestURI();
            if (roleid != null) {
                ArrayList data = (ArrayList<Object>) session.getAttribute("interfaced");
                if (data != null && data.size() > 0) {
                    if (data != null) {
                        int i = 0;
                        for (Object datum : data) {
                            JSONObject json = (JSONObject) JSONObject.toJSON(datum);
                            String interfaceurl = json.getString("interfaceurl");
                            if (interfaceurl.equals(requestURI)) {
                                i++;
                                break;
                            }
                        }
                        if (i == 0) {
                            response.setStatus(500);
                            return false;
                        }
                    }
                } else {
                    response.setStatus(500);
                    return false;
                }
            }
        }
        return true;
    }
}

  @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    //后置拦截器,删除一些预置信息,避免内存泄露
 @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserThreadLocal.removeUser();
    }

五、拦截程序中接口,进入HandlerInterceptor实现类

@Configuration
public class MenuUnauthorizedConfig implements WebMvcConfigurer {

    @Autowired
    MenuUnauthorizedInterceptor menuUnauthorizedInterceptor;

    /**
     * 添加Web项目的拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 对所有访问路径,都通过MenuUnauthorizedInterceptor类型的拦截器进行拦截
        registry.addInterceptor(new MenuUnauthorizedInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login")
                .excludePathPatterns("/index")
                .excludePathPatterns("/logout")
                .excludePathPatterns("/img/**")
                .excludePathPatterns("/images/**")
                .excludePathPatterns("/resources/**")
                .excludePathPatterns("/business/**")
                .excludePathPatterns("/static/", "/css/", "/image/", "/js/",    // 过滤不验证的路径
                        "/scaptcha","/loadmain","/sysmenu/query/by/currentuser",
                        "/page/loadmain","/page/sysrole","/api/**",
                        "/relation/partner/api/query/by/partnerid/******",
                        "/relation/role/menu/query/by/roleid/******",
                        "/page/sysrole/**","/page/**","/syspartner/**",
                        "/assets/css/***", "/assets/font/***",
                        "/assets/js/css/modules/laydate/default/******",
                        "/assets/js/css/modules/layer/default/******",
                        "/assets/js/css/modules/****",
                        "/assets/img/***", "/assets/js/***",
                        "/assets/service/***", "/css/**",
                        "/css/partner/***", "/frame/**",
                        "/frame/css/***", "/frame/img/***",
                        "/frame/js/***", "/frame/less/***",
                        "/frame/plugin/***", "/js/**");
    }
}

在WebMvcConfigurer 方法中可以指定拦截规则
1、addPathPatterns:该方法用于指定拦截路径,例如拦截路径为“/**”,表示拦截所有请求,包括对静态资源的请求。
2、excludePathPatterns:该方法用于排除拦截路径,即指定不需要被拦截器拦截的请求。

六、拦截失败的原因
1、在拦截过程中如果发现过滤某些接口不走当前拦截器,发现不生效,原因如下
在这里插入图片描述
1.配置拦截器时,如果excludePathPatterns没有生效,可能是url配置有问题。
2.可以检查下application.yml或者application-dev.properties的context-path,或者其它类似的地方,配置拦截器的url不应该包含这些路径,只要从Controller的路径开始配置即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭优秀的笔记

你的支持就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值