java.lang.Object
org.miaixz.bus.spring.web.SentinelRequestHandler
- All Implemented Interfaces:
org.springframework.web.servlet.HandlerInterceptor
public class SentinelRequestHandler
extends Object
implements org.springframework.web.servlet.HandlerInterceptor
请求安全哨兵拦截器 - 提供API请求的全链路安全防护与审计功能
性能优化
- 使用
CacheRequestWrapper实现请求体缓存, 解决InputStream只能读取一次的问题 - 响应体记录限制长度(默认150字符),防止大响应体导致内存溢出
- 支持异步日志记录,减少对主流程性能影响
- 在生产环境启用所有安全模块
- 定期审计安全日志,分析异常模式
- 结合WAF(Web应用防火墙)使用,形成纵深防御
- 对敏感API实施更严格的安全策略
- 定期更新安全策略,应对新型攻击手段
此类设计为可扩展架构,支持以下扩展点:
- 自定义安全策略实现
- 插件式安全模块添加
- 自定义日志格式和输出目标
- 集成第三方安全服务
- Since:
- Java 17+
- Author:
- Kimi Liu
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidafterCompletion(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, Exception exception) 完成请求处理后回调,将调用处理程序执行的任何结果, 因此允许进行适当的资源清理等 注意:只有在拦截器的preHandle方法返回true与postHandle方法一样,将在每个方法上调用该方法, 在链中的拦截器的顺序是相反的,所以第一个拦截器是最后调用的static StringgetClientIP(jakarta.servlet.http.HttpServletRequest request, String... otherHeaderNames) 获取客户端IP 默认检测的Header:static StringgetClientIPByHeader(jakarta.servlet.http.HttpServletRequest request, String... headerNames) 获取客户端IP headerNames参数用于自定义检测的Header 需要注意的是,使用此方法获取的客户IP地址必须在Http服务器(例如Nginx)中配置头信息,否则容易造成IP伪造。voidpostHandle(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) 拦截处理程序的执行 实际上是在HandlerAdapter之后调用的 调用处理程序,但在DispatcherServlet呈现视图之前 可以通过给定的ModelAndView向视图公开额外的模型对象 DispatcherServlet在一个执行链中处理一个处理程序,由 任意数量的拦截器,处理程序本身在最后 使用这种方法,每个拦截器可以对一个执行进行后处理, 按执行链的相反顺序应用booleanpreHandle(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler) 业务处理器处理请求之前被调用,对用户的request进行处理,若返回值为true, 则继续调用后续的拦截器和目标方法;若返回值为false, 则终止请求; 这里可以加上登录校验,权限拦截、请求限流等voidrequestInfo(jakarta.servlet.http.HttpServletRequest request, String method) 请求日志信息voidrequestParameters(jakarta.servlet.http.HttpServletRequest request) 记录请求参数
-
Constructor Details
-
SentinelRequestHandler
public SentinelRequestHandler()
-
-
Method Details
-
preHandle
public boolean preHandle(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler) 业务处理器处理请求之前被调用,对用户的request进行处理,若返回值为true, 则继续调用后续的拦截器和目标方法;若返回值为false, 则终止请求; 这里可以加上登录校验,权限拦截、请求限流等- Specified by:
preHandlein interfaceorg.springframework.web.servlet.HandlerInterceptor- Parameters:
request- 当前的HTTP请求response- 当前的HTTP响应handler- 执行的处理程序- Returns:
- 如果执行链应该继续执行, 则为:true 否则:false
-
afterCompletion
public void afterCompletion(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, Exception exception) 完成请求处理后回调,将调用处理程序执行的任何结果, 因此允许进行适当的资源清理等 注意:只有在拦截器的preHandle方法返回true与postHandle方法一样,将在每个方法上调用该方法, 在链中的拦截器的顺序是相反的,所以第一个拦截器是最后调用的- Specified by:
afterCompletionin interfaceorg.springframework.web.servlet.HandlerInterceptor- Parameters:
request- 当前的HTTP请求response- 当前的HTTP响应handler- 执行的处理程序exception- 处理程序执行时抛出异常
-
postHandle
public void postHandle(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) 拦截处理程序的执行 实际上是在HandlerAdapter之后调用的 调用处理程序,但在DispatcherServlet呈现视图之前 可以通过给定的ModelAndView向视图公开额外的模型对象 DispatcherServlet在一个执行链中处理一个处理程序,由 任意数量的拦截器,处理程序本身在最后 使用这种方法,每个拦截器可以对一个执行进行后处理, 按执行链的相反顺序应用- Specified by:
postHandlein interfaceorg.springframework.web.servlet.HandlerInterceptor- Parameters:
request- 当前的HTTP请求response- 当前的HTTP响应handler- 执行的处理程序modelAndView- 处理程序返回的{code ModelAndView} 也可以是null)
-
requestParameters
public void requestParameters(jakarta.servlet.http.HttpServletRequest request) 记录请求参数- Parameters:
request- HTTP请求
-
getClientIP
public static String getClientIP(jakarta.servlet.http.HttpServletRequest request, String... otherHeaderNames) 获取客户端IP 默认检测的Header:1、X-Forwarded-For 2、X-Real-IP 3、Proxy-Client-IP 4、WL-Proxy-Client-IP
otherHeaderNames参数用于自定义检测的Header 需要注意的是,使用此方法获取的客户IP地址必须在Http服务器(例如Nginx)中配置头信息,否则容易造成IP伪造。
- Parameters:
request- 请求对象HttpServletRequestotherHeaderNames- 其他自定义头文件,通常在Http服务器(例如Nginx)中配置- Returns:
- IP地址
-
getClientIPByHeader
public static String getClientIPByHeader(jakarta.servlet.http.HttpServletRequest request, String... headerNames) 获取客户端IP headerNames参数用于自定义检测的Header 需要注意的是,使用此方法获取的客户IP地址必须在Http服务器(例如Nginx)中配置头信息,否则容易造成IP伪造。- Parameters:
request- 请求对象HttpServletRequestheaderNames- 自定义头,通常在Http服务器(例如Nginx)中配置- Returns:
- IP地址
-
requestInfo
请求日志信息- Parameters:
request- 网络请求method- 请求类型
-