Module bus.starter

Class SentinelRequestHandler

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字符),防止大响应体导致内存溢出
  • 支持异步日志记录,减少对主流程性能影响
安全最佳实践
  1. 在生产环境启用所有安全模块
  2. 定期审计安全日志,分析异常模式
  3. 结合WAF(Web应用防火墙)使用,形成纵深防御
  4. 对敏感API实施更严格的安全策略
  5. 定期更新安全策略,应对新型攻击手段
扩展点

此类设计为可扩展架构,支持以下扩展点:

  • 自定义安全策略实现
  • 插件式安全模块添加
  • 自定义日志格式和输出目标
  • 集成第三方安全服务
Since:
Java 17+
Author:
Kimi Liu
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    afterCompletion(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, Exception exception)
    完成请求处理后回调,将调用处理程序执行的任何结果, 因此允许进行适当的资源清理等 注意:只有在拦截器的preHandle 方法返回truepostHandle方法一样,将在每个方法上调用该方法, 在链中的拦截器的顺序是相反的,所以第一个拦截器是最后调用的
    static String
    getClientIP(jakarta.servlet.http.HttpServletRequest request, String... otherHeaderNames)
    获取客户端IP 默认检测的Header:
    static String
    getClientIPByHeader(jakarta.servlet.http.HttpServletRequest request, String... headerNames)
    获取客户端IP headerNames参数用于自定义检测的Header 需要注意的是,使用此方法获取的客户IP地址必须在Http服务器(例如Nginx)中配置头信息,否则容易造成IP伪造。
    void
    postHandle(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView)
    拦截处理程序的执行 实际上是在HandlerAdapter之后调用的 调用处理程序,但在DispatcherServlet呈现视图之前 可以通过给定的ModelAndView向视图公开额外的模型对象 DispatcherServlet在一个执行链中处理一个处理程序,由 任意数量的拦截器,处理程序本身在最后 使用这种方法,每个拦截器可以对一个执行进行后处理, 按执行链的相反顺序应用
    boolean
    preHandle(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler)
    业务处理器处理请求之前被调用,对用户的request进行处理,若返回值为true, 则继续调用后续的拦截器和目标方法;若返回值为false, 则终止请求; 这里可以加上登录校验,权限拦截、请求限流等
    void
    requestInfo(jakarta.servlet.http.HttpServletRequest request, String method)
    请求日志信息
    void
    requestParameters(jakarta.servlet.http.HttpServletRequest request)
    记录请求参数

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 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:
      preHandle in interface org.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 方法返回truepostHandle方法一样,将在每个方法上调用该方法, 在链中的拦截器的顺序是相反的,所以第一个拦截器是最后调用的
      Specified by:
      afterCompletion in interface org.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:
      postHandle in interface org.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 - 请求对象HttpServletRequest
      otherHeaderNames - 其他自定义头文件,通常在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 - 请求对象HttpServletRequest
      headerNames - 自定义头,通常在Http服务器(例如Nginx)中配置
      Returns:
      IP地址
    • requestInfo

      public void requestInfo(jakarta.servlet.http.HttpServletRequest request, String method)
      请求日志信息
      Parameters:
      request - 网络请求
      method - 请求类型