Spring拦截器实现鉴权

这篇具有很好参考价值的文章主要介绍了Spring拦截器实现鉴权。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是拦截器?

拦截器(Interceptor)类似于Servlet中的过滤器,主要用于拦截用户请求并做出相应的处理,例如拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。拦截器允许自定义预处理(Pre-Processing),在其中可以选择禁止对应Handler 的执行;也允许自定义后处理(Post-Precessing);



怎样实现Spring拦截器?

实现Spring拦截器很简单,只需要实现HandlerInterceptor接口即可。HandlerInterceptor这个接口中有三个核心方法:

1.preHandle方法:在HandlerMapping确定Handler对象之后,但在HandlerAdapter调用handler之前执行(就是在调用controller之前执行该方法)。该方法返回一个布尔值,只有true的时候才继续执行对应的handler,否则不再执行对应的handler了。

default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return true;
	}

2.postHandle方法:在 HandlerAdapter 实际调用处理程序之后,但在 DispatcherServlet 呈现视图之前调用(就是在响应返回客户端之前执行)。

default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}

3.afterCompletion方法:请求处理完成后回调,即渲染视图后。将在处理程序执行的任何结果上被调用,从而允许适当的资源清理。注意:只有当这个拦截器的 preHandle 方法成功完成并返回 true 时才会被调用!与 postHandle 方法一样,该方法将以相反的顺序在链中的每个拦截器上调用,因此第一个拦截器将是最后一个被调用的。

default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}

关于上述三个核心方法调用的顺序,在此我们假设有是三个拦截器,Interceptor1 、Interceptor2、和Interceptor3。在定义三个拦截器的时候我们就是按照这个顺序定义的,而拦截器的执行顺序就是按照之前定义的顺序执行。

Interceptor1的preHandle方法 -> Interceptor2的preHandle方法 -> Interceptor3的preHandle方法 -> controller ->Interceptor3 的postHandle方法 -> Interceptor2 的postHandle方法 -> Interceptor1 的postHandle方法 -> Interceptor3 的afterCompletion方法 -> Interceptor2 的afterCompletion方法 ->Interceptor1 的afterCompletion方法。如图:



Spring拦截器实现鉴权





如何使用Spring拦截器鉴权?

通过上述对三个核心方法的解释可知,如果我们想通过拦截器实现鉴权,那么只需要实现接口后,在preHandle方法中做相应的处理即可。如下:

public class SecurityInterceptor implements HandlerInterceptor {

    @Autowired
    private JddPmsHelper jddPmsHelper;

    @Value("${global.authTest}")
    private String authTest;


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //测试环境不校验权限,需预发验证
        if ("true".equals(authTest)) {
            return true;
        }

        String uri = request.getRequestURI();
        if (uri.contains("static")) {
            return true;
        }
        String pin = ServletUtils.getCommonPin();
        if (StringUtils.isBlank(pin)) {
            throw new NoLoginException("未登陆");
        }
        if (uri.equals("/")) {
            return true;
        }

        boolean checkResult = jddPmsHelper.authCheckUrl(pin, uri);

        if (!checkResult) {
            throw new NoneSecurityException("您没有权限访问,请联系管理员,对您的erp账号进行配置");
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }


}

在实现HandlerInterceptor接口之后,可以通过

1、拦截器注册:实现WebMvcConfigurer的addInterceptors注册。

/**
 * 拦截器注册 WebConfig
 *

 */
@Configuration
@Slf4j
public class WebConfig implements WebMvcConfigurer {
    /**
     * 登录/权限拦截器
     */
    @Resource
    private CombinedLoginInterceptor combinedLoginInterceptor;
    /**
     * 控制层切面处理
     * ControllerExceptionHandler
     */
    @Resource
    private ControllerExceptionResolver controllerExceptionResolver;

    /**
     *
     */
    private static final String MATCH_ALL = "/**";
    /**
     * 免验证
     */
    private static final String APP_EXCLUDE = "/common/info";
    /**
     * 异常页
     */
    private static final String ERROR_URL = "/error";
    /**
     * 无需权限验证的URI集合
     */
    private static final String[] PC_WHITE_LIST = {APP_EXCLUDE, ERROR_URL};


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //PC端登录拦截,必须添加
        registry.addInterceptor(combinedLoginInterceptor).addPathPatterns(MATCH_ALL).excludePathPatterns(PC_WHITE_LIST).order(1);

    }

    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(controllerExceptionResolver);
    }

}

2、通过XML文件注册


    <!-- 单点登录拦截器配置-->
    <mvc:interceptors>


        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.xxx.intercepter.SecurityInterceptor"/>
        </mvc:interceptor>

    </mvc:interceptors>



除了使用拦截器鉴权,还可以有哪几种方式?

1、传统AOP方式:在Controller方法前添加切点,然后再对切点进行处理即可。

2、过滤器:其实现相对简单,只需要实现Filter接口即可。

详细实现可以参考这篇文章: SpringBoot 项目鉴权的 4 种方式-阿里云开发者社区

 文章来源地址https://www.toymoban.com/news/detail-505040.html

到了这里,关于Spring拦截器实现鉴权的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot篇】Interceptor拦截器 | 拦截器和过滤器的区别

    拦截器(Interceptor)是一种软件设计模式,用于在应用程序处理请求或响应时对其进行拦截和修改。拦截器可以在整个应用程序中使用,用于执行跨越多个层的通用任务,如身份验证、授权、缓存、日志记录、性能计量等。 在Web开发中,拦截器通常用于在请求到达控制器之前

    2024年02月04日
    浏览(43)
  • SpringMVC拦截器 (Interceptor)

            Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、判断用户是否登录等。         拦截器依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的

    2024年01月22日
    浏览(32)
  • SpringMVC的拦截器(Interceptor)

    对于拦截器这节的知识,我们需要学习如下内容: 拦截器概念 入门案例 拦截器参数 拦截器工作流程分析 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如果是

    2024年02月09日
    浏览(30)
  • SpringBoot(八)拦截器Interceptor

        上篇介绍了Filter过滤器的使用,提起过滤器,就不得不再提起另外一个叫做拦截器的东西。两者的作用类似,都可以实现拦截请求的作用,但其实两者有着非常大的区别。本篇,我们就来学习下拦截器的使用。     如果你是新手,且没看过我之前的一系列SpringBoot文章,

    2024年02月17日
    浏览(33)
  • 【SpringBoot】拦截器(Interceptor)的使用

            拦截器(Interceptor)是一种特殊的组件,它可以在请求处理的过程中对请求和响应进行拦截和处理。拦截器可以在请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定的操作。拦截器的主要目的是在不修改原有代码的情况下,实现对请求和响

    2024年02月04日
    浏览(32)
  • 过滤器Filter,拦截器Interceptor

    过滤器Filter 快速入门   详情 登录校验-Filter 拦截器Interceptor 简介快速入门 定义拦截器 配置拦截器 详解(拦截路径,执行流程) 登录校验-Interceptor

    2024年02月07日
    浏览(31)
  • quarkus依赖注入之五:拦截器(Interceptor)

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《quarkus依赖注入》系列的第五篇,经过前面的学习,咱们熟悉了依赖注入的基本特性,接下来进一步了解相关的高级特性,先从本篇的拦截器开始 如果您熟悉spring的话,对拦截器应该不会陌

    2024年02月14日
    浏览(27)
  • SpringBoot自定义拦截器interceptor使用详解

    Spring Boot拦截器Intercepter详解 Intercepter是由Spring提供的Intercepter拦截器,主要应用在日志记录、权限校验等安全管理方便。 使用过程 1.创建自定义拦截器,实现HandlerInterceptor接口,并按照要求重写指定方法 HandlerInterceptor接口源码: 根据源码可看出HandlerInterceptor接口提供了三个

    2024年02月13日
    浏览(26)
  • 7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

    在【 7.1 】管理员图书录入和修改API,当时预告过:并没有写【校验是否是管理员】的逻辑,因为是通用逻辑,会单写一篇来细讲,那么今天就来安排! 角色权限校验 ,是保证接口安全必备的能力:有权限才可以操作!所以,一般对于这种通用逻辑,推荐不与主业务逻辑耦合

    2024年02月16日
    浏览(27)
  • 详解过滤器Filter和拦截器Interceptor的区别和联系

    目录 前言 区别 联系 过滤器(Filter)和拦截器(Interceptor)都是用于在Web应用程序中处理请求和响应的组件,但它们在实现方式和功能上有一些区别。 1. 实现方式: - 过滤器是基于Servlet规范的组件,通过实现 javax.servlet.Filter接口 来定义。过滤器可以在请求被处理之前和响应被发送

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包