赞
踩
在Spring Boot项目中实现接口拦截通常涉及到两个关键组件:拦截器(Interceptor)和过滤器(Filter)。Spring框架提供了这两种机制来进行HTTP请求的拦截,可以根据需要的粒度和场景来选择使用
重点:
但是在项目中都是将其抽取出来作为一个单独的权限服务,和用户是绑定的关系,并非是直接在代码中进行硬编码做拦截接口,而是通过注解或者是通过配置文件,在访问接口前通过调用RPC接口的方式进行权限校验等等。
提示:以下是本篇文章正文内容,下面案例可供参考
Spring MVC的拦截器可以让你在请求被处理之前后以及完成之后进行一些操作。要创建一个拦截器,你需要:
import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class MyCustomInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在Controller处理之前调用 // 返回true继续流程,返回false中止流程 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在Controller处理之后调用,视图渲染之前 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在整个请求结束之后调用,也就是在DispatcherServlet 渲染了视图执行 } }
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private MyCustomInterceptor myCustomInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myCustomInterceptor) .addPathPatterns("/**"); // 你可以添加特定路径的模式去匹配需要拦截的请求 } }
Spring Boot也支持标准的Servlet Filters。
这些filters在Spring MVC的DispatcherServlet 处理请求之前执行,这使得它们在处理请求时更加底层,也适用于非Spring管理的组件。
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Component public class MyCustomFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; // 自定义一些操作 chain.doFilter(request, response); // 继续执行链中的下一个过滤器 } }
Spring Boot会自动检测到实现了 Filter 接口的bean,并将它添加到filter链中。另外你也可以手动注册一个filter,通过一个 FilterRegistrationBean:
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<MyCustomFilter> myFilter() { FilterRegistrationBean<MyCustomFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MyCustomFilter()); registrationBean.addUrlPatterns("/*"); return registrationBean; } }
1、如果你想要利用Spring MVC的一些高级特性(如控制器映射、参数处理等),或者只是拦截由Spring处理的请求,使用Interceptor。
2、如果你需要更底层的控制,或者你需要拦截不论是不是Spring MVC处理的请求(比如直接请求静态资源文件),你可能会需要使用Filter。
拦截器(Interceptor)和过滤器(Filter)主要解决的问题是如何在不改变现有业务代码的情况下,统一处理HTTP请求和响应中的跨切面问题。他们在不同的层面上提供了处理请求的能力,这样开发人员可以以模块化的方式应用通用功能,而不必在每一个控制器或组件中重复相同的逻辑。
下面是拦截器和过滤器主要解决的几个问题:
**身份验证和授权:**确保用户在访问受保护资源之前已经正确地进行了身份验证,并且具备相应的权限。
日志记录:自动记录请求的详细信息,以便于调试、监控和审计。
异常处理:拦截由控制器抛出的异常,提供统一的异常处理逻辑。
性能监控:拦截请求,以监控处理时间,从而提供性能进度信息。
事务管理:在请求的生命周期中处理复杂的事务边界。
输入验证:拦截请求和对输入数据执行预处理,比如数据清洗、格式验证。
本地化:确定请求的本地化设置并相应地应用它们。
API协议处理:确保请求遵循特定的API协议,例如签名验证、版本控制。
HTTP请求修改:在Servlet层面上对进入的HTTP请求进行修改,比如增加、修改、删除请求头部信息。
HTTP响应修改:在返回给客户端之前对HTTP响应进行修改。
跨域资源共享(CORS):添加CORS(Cross-Origin Resource Sharing)头信息,允许或限制跨域请求。
安全性:实施如同拦截器的身份验证和授权控制,但在Servlet更早的阶段执行。
编码设置:确保请求和响应采用正确的字符编码。
资源管理:如在请求处理前后对资源进行分配和释放。
压缩:对响应体数据进行压缩以降低带宽消耗。
缓存控制:实现HTTP缓存逻辑,如ETags或者设置过期头部信息。
通过以上功能,拦截器和过滤器使得Spring Boot项目可以通过统一而高效的方式解决跨多个请求和响应的共性问题,并使得业务逻辑保持干净和聚焦于核心功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。