Springboot如何利用拦截器拦截请求信息收集到日志详解

yizhihongxing

下面是 Spring Boot 如何利用拦截器拦截请求信息收集到日志的攻略:

1. 什么是拦截器?

拦截器(Interceptor)是 Spring 框架提供的一种机制,用于在请求前后对请求进行预处理和后处理。在 Spring Boot 中,可以使用拦截器实现对请求的统一拦截,常见的应用场景包括日志记录、权限控制等。

2. 如何创建一个拦截器?

创建一个拦截器,需要先实现 HandlerInterceptor 接口,并重写其中的方法,默认情况下只需要重写其中一个方法 preHandle() 即可。

public class LogInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 实现拦截前的业务逻辑
        return true; // 返回值表示是否将请求继续转发处理
    }
}

3. 如何在 Spring Boot 中应用拦截器?

首先,在 Spring Boot 中需要将拦截器注册到项目中,可以通过继承 WebMvcConfigurerAdapter 并重写 addInterceptors() 方法实现:

@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Bean
    public LogInterceptor getLogInterceptor() {
        return new LogInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getLogInterceptor()).addPathPatterns("/**"); // 将拦截器注册到请求地址为 / 的路径下面
    }
}

上述代码中,我们创建了一个 LogInterceptor 的实例,并将其注册到请求路径为 / 的路径下面。

接下来,在 preHandle() 方法中,可以获取请求的信息,包括请求参数、请求 URL 等,然后将这些信息记录到日志里:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 获取请求的参数
    Map<String, String[]> paramMap = request.getParameterMap();
    String params = "";
    if (paramMap != null && paramMap.size() > 0) {
        for (Map.Entry<String, String[]> entry : paramMap.entrySet()) {
            params += entry.getKey() + "=" + Arrays.toString(entry.getValue()) + "&";
        }
        if (params.length() > 0) {
            params = params.substring(0, params.length() - 1);
        }
    }

    // 获取请求的 URL
    String requestUrl = request.getRequestURL().toString();

    // 输出日志信息
    Logger logger = LoggerFactory.getLogger(getClass());
    logger.debug("Interceptor Request: url={}, params={}", requestUrl, params);

    return true;
}

通过调用 getLogger() 方法获取到日志记录器的实例,并使用 debug() 方法记录日志信息。

4. 示例说明

示例1:拦截请求并记录日志

以下示例是一个拦截器,在接口请求时捕获请求中的参数并将其记录到日志中:

public class LoggingInterceptor implements HandlerInterceptor {

    private static final Logger log = LoggerFactory.getLogger(LoggingInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURI().toString();
        log.info("Request URL[{}]: {} Paramters: {}", request.getMethod(), url, getParameterMap(request));
        return true;
    }

    private String getParameterMap(HttpServletRequest request) {
        Map<String, String[]> parmsMap = request.getParameterMap();
        if (parmsMap == null) {
            return "";
        }
        String jsonObject = JSONObject.toJSONString(parmsMap);
        return jsonObject;
    }
}

在 Spring Boot web 应用的启动类中注册该拦截器:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        // 记录请求日志
        registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**");
    }
    ...
}

示例2:拦截请求并进行用户权限校验

以下示例是一个拦截器,实现了基本的用户权限校验功能:

public class AuthenticationInterceptor extends HandlerInterceptorAdapter {

    private static final Logger log = LoggerFactory.getLogger(AuthenticationInterceptor.class);

    @Autowired
    private UserService userService;

    private static final String HEADER_AUTHORIZATION = "Authorization";
    private static final String AUTHORIZATION_PREFIX = "Bearer ";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = getTokenFromHeader(request);
        if (StringUtils.isBlank(token)) {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }

        User user = userService.getUserFromToken(token);
        if (user == null) {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }

        request.setAttribute("currentUser", user);
        return true;
    }

    private String getTokenFromHeader(HttpServletRequest request) {
        String authorizationHeader = request.getHeader(HEADER_AUTHORIZATION);
        if (StringUtils.isBlank(authorizationHeader)) {
            return null;
        }

        if (!authorizationHeader.startsWith(AUTHORIZATION_PREFIX)) {
            return null;
        }

        return authorizationHeader.replace(AUTHORIZATION_PREFIX, "");
    }
}

在业务控制器中通过 @PreAuthorize 注解进行权限校验:

@RestController
@RequestMapping("/api")
public class UserController {

    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @GetMapping("/users")
    public ResponseEntity<List<User>> getUsers() {
        List<User> users = userService.findAll();
        return ResponseEntity.ok(users);
    }
    ...
}

同样地,要在 Spring Boot web 应用的启动类中注册该拦截器:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        // 鉴权
        registry.addInterceptor(new AuthenticationInterceptor()).addPathPatterns("/api/**");
    }
    ...
}

以上两个示例,分别演示了如何通过拦截器记录请求日志和进行用户权限校验。具体实现方式有所不同,但都可以通过继承 HandlerInterceptor 接口实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot如何利用拦截器拦截请求信息收集到日志详解 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • HTTP客户端异常的原因是什么?

    HTTP客户端常见的异常原因包括以下几点: 网络连接异常:客户端在发送请求时无法连接到服务器,这可能是由于网络连接中断、服务器宕机或DNS解析错误等原因造成的。此类异常通常抛出java.net.ConnectException或java.net.UnknownHostException等异常。 读取响应异常:客户端在接收服务器响应时,由于各种原因导致无法正确…

    云计算 2023年4月27日
    00
  • spring cloud gateway转发服务报错的解决

    以下是关于“springcloudgateway转发服务报错的解决”的完整攻略: 简介 在使用Spring Cloud Gateway进行服务转发时,有时会出现一些问题。本文将介绍如何决这些问题,并提供两个示例说明。 解决步骤 以下是使用Spring Cloud Gateway进行服务转发的步骤: 步骤一检查配置 首先,需要检查Spring Cloud Ga…

    http 2023年5月13日
    00
  • vue如何实现路由跳转到外部链接界面

    Vue.js 是一款流行的前端 JavaScript 框架,它提供了路由机制来管理应用程序的不同页面。Vue.js 的路由机制可以处理内部路由,但不能直接处理外部链接。这种情况下,开发者需要在Vue.js 应用程序中实现从内部路由链接到外部链接的跳转,本文将介绍如何实现这一操作的攻略。 使用Vue.js的Router-link组件实现跳转链接 Vue.js …

    http 2023年5月13日
    00
  • Idea 解决 Could not autowire. No beans of ‘xxxx’ type found 的错误提示

    Idea解决Could not autowire. No beans of ‘xxxx’ type found的错误提示 在使用Idea进行开发时,有时候我们会遇到Could not autowire. No beans of ‘xxxx’ type found的错误提示。这个错误提示通常由于Spring框架的自动装配机制出现问题导致的。本文将提供详细的解决…

    http 2023年5月13日
    00
  • Vue.js报错Failed to resolve filter问题的解决方法

    Vue.js报错Failed to resolve filter问题的解决方法 在使用Vue.js时,有时会遇到Failed to resolve filter的错误,这通常是由于Vue.js无法找到指定的过滤器导致的。本文将介绍如何解决这个问题。 解决方案 以下是一些可能的解决方案: 1. 检查过滤器名称 在Vue.js中,过滤器是一种用于格式化文本的功能…

    http 2023年5月13日
    00
  • PHP/Javascript/CSS/jQuery常用知识大全详细整理第1/2页

    以下是“PHP/Javascript/CSS/jQuery常用知识大全详细整理第1/2页”的攻略,其中包含两个示例: PHP常用知识大全 变量和数据类型 PHP中的变量可以存储各种类型的数据,例如字符串、整数、浮点数、数组等。以下是一些示例: $name = "John"; $age = 30; $height = 1.75; $frui…

    http 2023年5月13日
    00
  • HTTP的Referer头部有什么作用?

    HTTP的Referer头部是HTTP请求头中的一个字段,用来标识请求的源地址。它通常用于记录从哪个页面或网站跳转到当前页面或网站,以及在一些场景中作为防盗链的控制手段。 在网站开发中,开发者可以通过Referer字段识别用户访问来源,从而提高网站的流量转化率。例如,在电商平台中,对关键页面设置防盗链,可以阻止外部恶意网站盗用本站资源,同时,也方便管理自己网…

    Http网络协议 2023年4月20日
    00
  • IIS访问ASP页面时报错The requested resource is in use.的解决办法

    在IIS访问ASP页面时,有时候会遇到Therequestedresourceisinuse.的错误,这通常是由于端口被占用导致的。以下是一个关于解决IIS访问ASP页面时报错Thereedresourceuse.的攻略,其中包含了一些示例。 解决IIS访问ASP页面时报错Therequestedresourceisinuse. 在IIS访问ASP页面时,如…

    http 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部