springboot拦截器不拦截静态资源,只拦截controller的实现方法

 更新时间:2023年07月11日 14:30:54   作者:cying2029  
这篇文章主要介绍了springboot拦截器不拦截静态资源,只拦截controller的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springboot拦截器不拦截静态资源,只拦截controller

拦截器拦截静态资源问题

实现拦截器的做法就是实现HandlerInterceptor然后再WebMvcConfigurer里配置拦截器

这个时候,一般要手动添加过滤的静态资源路径,如果静态资源路径修改,则拦截器要修改

如果有添加其他拦截/**的拦截器,也需要配置静过滤态资源路径

@Configuration
public class WebConfigurer implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        String []strs = {"/static/**","/project/**","/assets/**","/login","/login.do"};
        registry.addInterceptor(loginInterceptor).excludePathPatterns(strs);
    }
}

只拦截controller方法

利用HandlerInterceptor 接口的handler

如果是controller的方法,handler为 HandlerMethod

如果是资源类,handler为 org.springframework.web.servlet.resource.ResourceHttpRequestHandler

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
	...

实现

加一层抽象类,新增的拦截器继承该抽象类,并在controllerMethodPreHandle方法实现业务功能,即可忽视静态资源类

public abstract class AbstrctControllerInterceptor implements HandlerInterceptor {
    protected abstract boolean controllerMethodPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException;
    @Override
    public final boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //如果是controller的方法handler为HandlerMethod
        //如果是资源类则handler为org.springframework.web.servlet.resource.ResourceHttpRequestHandler
        if(handler instanceof HandlerMethod){
            return controllerMethodPreHandle(request,response,handler);
        }
        //否则不拦截
        return true;
    }
}

登录拦截器实现

@Component
public class LoginInterceptor extends AbstrctControllerInterceptor {
    @Override
    protected boolean controllerMethodPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        Object user = request.getSession().getAttribute(ConstantValue.USER_CONTEXT_KEY);
        if(user == null){
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }
}

对比之前的配置,可以忽视资源路径了

@Configuration
public class WebConfigurer implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        String []strs = {"/static/**","/project/**","/assets/**","/login","/login.do"};
        String []strs = {"/login","/login.do"};
        registry.addInterceptor(loginInterceptor).excludePathPatterns(strs);
    }
}

springboot拦截器问题

Spring Boot 拦截器是 AOP 的一种实现,专门拦截对控制层的请求,主要应用于判断用户权限,拦截webSocket请求。

在 Spring Boot 项目中,使用拦截器功能通常需要以下 2 步:

  • 1.创建拦截器;
  • 2.配置拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)。

第一步:创建拦截器

创建的类实现 HandlerInterceptor 接口,即可成为拦截器类

HandlerInterceptor 接口中定义以下 3 个方法,如下表所示。

在这里插入图片描述

实例:

/**
 * 自定义拦截器类
 */
public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口
	/**
	 * 访问控制器方法前执行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
		return true;
	}
	/**
	 * 访问控制器方法后执行
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
	}
	/**
	 * postHandle方法执行完成后执行,一般用于释放资源
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
	}
}

注意:MyInterceptor 中的方法执行顺序为 preHandle – Controller 方法 – postHandle – afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控。

第二步:配置拦截器

/**
 * Web配置类
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
	/**
	 * 添加Web项目的拦截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截
		registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
		.excludePathPatterns("/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
		 //放行登录页,登陆操作,静态资源
	}
}

在指定拦截器拦截规则时,调用了两个方法,这两个方法的说明如下:

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA提高第十篇 ArrayList深入分析

    JAVA提高第十篇 ArrayList深入分析

    这篇文章主要深入分析了JAVA提高第十篇ArrayList的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • SpringBoot @RestControllerAdvice注解对返回值统一封装的处理方法

    SpringBoot @RestControllerAdvice注解对返回值统一封装的处理方法

    这篇文章主要介绍了SpringBoot @RestControllerAdvice注解对返回值统一封装,使用@RestControllerAdvice对响应进行增强,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Java基础之详解基本数据类型的使用

    Java基础之详解基本数据类型的使用

    今天给大家带来的是关于Java基础的相关知识,文章围绕着基本数据类型的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • SpringBoot AOP Redis实现延时双删功能实战

    SpringBoot AOP Redis实现延时双删功能实战

    本文主要介绍了SpringBoot AOP Redis实现延时双删功能实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Spring Cloud应用实现配置自动刷新过程详解

    Spring Cloud应用实现配置自动刷新过程详解

    这篇文章主要介绍了Spring Cloud应用实现配置自动刷新过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • RocketMQ事务消息图文示例讲解

    RocketMQ事务消息图文示例讲解

    RocketMQ事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布式事务功能,通过事务消息能达到分布式事务的最终一致
    2022-12-12
  • 基于字符串常用API(详解)

    基于字符串常用API(详解)

    下面小编就为大家带来一篇基于字符串常用API(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java中加密的实现方法(MD5,MD2,SHA)

    java中加密的实现方法(MD5,MD2,SHA)

    这篇文章主要介绍了java中加密的实现方法(MD5,MD2,SHA)的相关资料,这里提供三种实现加密的方法,大家可以对比一下,需要的朋友可以参考下
    2017-08-08
  • Spring的异常重试框架Spring Retry简单配置操作

    Spring的异常重试框架Spring Retry简单配置操作

    这篇文章主要介绍了Spring的异常重试框架Spring Retry简单配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • JEE与Spring Boot代码性能比较分析

    JEE与Spring Boot代码性能比较分析

    JavaEE与Spring Boot其实很难比较测试,前者适合单体SOA架构,后者适合微服务,但是还是有好事者把两者放在一起比较性能。这篇文章主要介绍了JEE与Spring Boot代码性能比较,需要的朋友可以参考下
    2018-11-11

最新评论