杭州企业推广网站,wordpress设置标题颜色,小金县建设局网站,在线学习网站建设Springboot 过滤器、拦截器、全局异常处理
一 过滤器#xff08;Filter#xff09;
过滤器是JavaWeb三大组件#xff08;Servlet#xff0c;Filter#xff0c;Listener#xff09;之一。
Filter可以把对资源的请求拦截下来#xff0c;从而实现一些功能。
注意#…Springboot 过滤器、拦截器、全局异常处理
一 过滤器Filter
过滤器是JavaWeb三大组件ServletFilterListener之一。
Filter可以把对资源的请求拦截下来从而实现一些功能。
注意过滤器一般用于一些通用的操作比如登录校验统一编码处理敏感字符处理等。
1.定义过滤器
1.创建一个类实现 javax.servlet.Filter接口并且实现其方法。
2.配置过滤器
在类上增加 WebFilter 注解配置拦截资源的路径并且在引导类上增加ServletComponentScan开启Servlet的组件支持。 注意Filter 是JavaWeb的组件并非Spring组件所以还需要在引导类上使用ServletComponentScan开启对Filter组件的支持 WebFilter
public class CustomFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化方法Web服务启动创建Filter时调用一次。可以不用重写Filter.super.init(filterConfig);}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {// 拦截到请求时调用该方法。是拦截器的核心filterChain.doFilter(servletRequest,servletResponse);}Overridepublic void destroy() {// 销毁方法服务器关闭时调用一次可以不重写Filter.super.destroy();}
}拦截器Filter的核心方法是 doFilter(),处理相关逻辑的代码几乎都写在此处。
可以通过WebFilter注解的属性urlPatterns来配置需要进行过滤的资源信息。
示例使用 urlPatterns /*配置过滤所有请求
WebFilter(urlPatterns /*)
public class CustomFilter implements Filter {Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {//放行对资源的请求filterChain.doFilter(servletRequest,servletResponse);}
}3.OncePerRequestFilter
在实际使用中推荐使用OncePerRequestFilter 它是Spring框架提供的一个抽象类用于确保过滤器只在每个请求中被调用一次。它继承自
GenericFilterBean类并在 doFilter 方法中添加了对请求是否已被过滤的判断逻辑。
OncePerRequestFilter 和 Filter 的根本区别在于 OncePerRequestFilter 提供了一个确保过滤器只在每个请求中被调用一次的机制而 Filter 接
口本身并没有提供这样的机制。
Configuration
public class JwtAuthenticationFilter extends OncePerRequestFilter {Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {filterChain.doFilter(httpServletRequest, httpServletResponse);}}
}而且使用OncePerRequestFilter的实现类并不需要在项目的启动类上增加ServletComponentScan注解。
二 拦截器Interceptor
1.拦截器概述
拦截器是一种动态拦截方法调用的机制与过滤器类似。是Spring框架中提供的用来动态拦截控制器方法的执行。
它的主要作用是拦截请求在指定的方法前后调用根据业务需要执行预先设定的代码。
2.定义拦截器Interceptor
定义一个拦截器继承HandlerInterceper,并实现其方法。
HandlerInterceptor中的方法都提供了默认实现可根据业务需求来决定重写哪些方法。
注意要为拦截器添加Component注解将其交给IOC容器管理。
Component
public class CustomInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//在目标资源方法执行前执行返回true放行false 不放行return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//在目标资源方法之后执行HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//在整体请求完成之后调用HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}Component注解是Spring框架中用于表示一个类为Spring组件的通用注解通过添加Component注解可以告诉Spring容器在项目初始化时将该类实例化为一个Bean,并由Spring容器管理。HandlerInterceptor是SpringMVC框架中的拦截器接口用于拦截请求的处理过程并进行响应的处理。可以通过实现HandlerInterceptor类来自定义拦截器实现更灵活的业务控制。
3.注册拦截器
自定义的拦截器需要进行注册。可实现WebMvcConfigurer 接口实现 addInterceptors方法为其添加新的拦截器。
Configuration
public class SpringWebConfigurer implements WebMvcConfigurer {//方式1如果在定义拦截器的时候已经添加了Component注解则直接使用注入的方式将拦截器对象注册到InterceptorRegistry对象中Resourceprivate CustomInterceptor customInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {// 使用 addPathPatterns 添加拦截路径支持数组// /**表示拦截所有资源属于 AntPathMatcher蚂蚁路径匹配器语法//方式1使用注入的对象registry.addInterceptor(customInterceptor).addPathPatterns(/**);//方式2也可以直接创建对象添加到InterceptorRegistry对象中registry.addInterceptor(new CustomInterceptor()).addPathPatterns(/**);}
}InterceptorRegistry是Spring框架中专门用来管理拦截器的集合类。通过InterceptorRegistry对象可以添加拦截器。并且指定它们的执行顺序。 WebMvcConfigurer是Spring框架中用于配置Mvc特性的接口通过实现WebMvcConfigurer接口可以对SpringMVC进行自定义配置包括添加拦截器资源处理器视图解析器等。 Configuration注解是Spring框架中用于表示配置类的注解通过添加Configuration注解可以告诉Spring容器该类是一个配置类其中包含了一些配置信息例如 Bean的定义Bean之间的依赖关系组件扫描等。 addPathPatterns方法用来配置需要拦截的资源路径。 excludePathPatterns方法用来配置不需要拦截的资源路径。
4.AntPathMatcher
Ant风格的路径模式匹配AntPathMatcher支持以下通配符
? 匹配一个字符* 匹配0个或多个字符** 匹配0个或多个目录
5.拦截路径
拦截路径的简单示意 6.过滤器和拦截器的执行流程
当过滤器与拦截器同时存在时它们的执行流程如下 dispatcherServlet的说明
dispatcherServlet是SpringMVC框架中的一个关键组件用于所有进入应用程序的请求并将其分派到相应的处理程序Controller进行处理.
dispatcherServlet是一个Servlet,负责接收HTTP请求并根据请求的URL将请求分发给合适的Controller。
dispatcherServlet可以通过配置来定制各种行为包括URL映射视图解析异常处理等。是整个SpringMVC框架的核心负责协调各个组件的工作实现请求的处理和响应的生成。
执行流程说明
浏览器发送请求先到过滤器Filter过滤器Filter放行之后HTTP请求经过dispatcherServlet的派发到达拦截器Interceptor拦截器Interceptor放行之后请求才会真正进入处理程序Controller处理程序Controller生成响应结果将结果返回到拦截器Interceptor拦截器Interceptor最后再将结果返回过滤器Filter最后响应给浏览器
7.过滤器和拦截器的区别
接口规范不同过滤器需要实现Filter接口而拦截器需要实现HandlerInterceptor接口并且需要注册到InterceptorRegistry集合中。拦截范围不同过滤器会拦截所有的请求资源而拦截器只会拦截Spring环境中的资源。
三 全局异常处理
定义一个类并且使用 RestControllerAdvice 注解则表明我们定义了一个全局异常处理类。
然后创建方法来捕获异常并且通过ExceptionHandler注解来表明要捕获的异常类型。并且将该异常的对象作为形参传入方法中。
RestControllerAdvice
public class GlobalExceptionHandler {ExceptionHandler(RuntimeException.class)public Result runtimeException(RuntimeException runtimeException) {return Result.err(runtimeException.getMessage());}
}注意Result是一个自定义的统一响应格式类其中包含了响应代码响应消息和响应数据。并且定义了几个常用的静态方法。
以上示例中为保证返回格式统一所以使用了Result作为返回类型。
RestControllerAdviceRestControllerAdvice 用于定义一个全局的异常处理类它结合了 ControllerAdvice 和 ResponseBody 两个注解的功能。在 Spring Boot 应用中我们可以使用 RestControllerAdvice 注解来统一处理异常返回统一的错误信息给前端。ExceptionHandlerExceptionHandler 用于在 Spring MVC 控制器类中定义方法来处理特定类型的异常。当控制器中的方法抛出指定类型的异常时ExceptionHandler 注解的方法会被调用来处理该异常从而提供定制化的异常处理逻辑