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

下面是 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日

相关文章

  • nginx配置IP白名单的详细步骤

    下面是nginx配置IP白名单的详细步骤: 步骤一:编辑nginx.conf文件 在nginx.conf文件中添加下面的配置,建议放在http{}模块中。 http { # 允许的IP列表 geo $allow_ips { default 0; # 将需要允许的IP添加到列表中,用空格隔开 192.168.1.2 127.0.0.1; } # 根据$allo…

    http 2023年5月13日
    00
  • 什么是HTTP cookie?

    HTTP cookie(简称cookie)是一种用于Web服务器保存客户端状态的机制。当用户使用Web浏览器访问网站时,Web服务器会向浏览器发送一些文本,然后浏览器保存这些文本。当用户再次访问该网站时,浏览器会将这些文本发送回Web服务器。这些文本称为“cookie”。 HTTP cookie通常用于身份验证、会话跟踪和个性化体验。它们可以为网站提供一种无…

    云计算 2023年4月27日
    00
  • 关于php curl获取301或302转向的网址问题的解决方法

    以下是关于“关于phpcurl获取301或302转向的网址问题的解决方法”的完整攻略: 简介 在使用phpcurl获取网页内容时,时候会遇到301或302转向的网址问题。这个问题通常是于网站重定向或跳转引起的。本文将介绍如何解决这个问题,并提供两个示例说明。 解方法 方法一:使用CURLOPT_FOLLOWLOCATION选项 在使用phpcurl获取网页内…

    http 2023年5月13日
    00
  • SpringBoot集成Mybatis的实现步骤

    SpringBoot集成Mybatis的实现步骤 SpringBoot集成Mybatis是一个常见的Java Web开发任务。本文将提供详细的实现步骤,括两个示例说明。 实现步骤 添加Mybatis和数据库驱动依赖。 在pom.xml文件中添加Mybatis和数据库驱动依赖。 <dependencies> <!– Mybatis –&g…

    http 2023年5月13日
    00
  • 使用Docker Compose搭建 Confluence的教程

    使用 Docker Compose 搭建 Confluence 的教程主要包括以下步骤: 步骤一:安装 Docker 和 Docker Compose 首先要确保你的电脑已经安装了 Docker 以及 Docker Compose。对于不同的操作系统,安装方式可能有所不同。以下是一些常见系统的安装方法: Windows:下载并安装 Docker Deskto…

    http 2023年5月13日
    00
  • 如何用python实现一个HTTP连接池

    以下是关于“如何用Python实现一个HTTP连接池”的完整攻略: 简介 HTTP连接池是一种用于管理HTTP连接的技术,可以提高HTTP的效率和性能。本文将介绍如何用Python实现一个HTTP连接池,包括创建连接池、获取连接、释放连接等。 实现步骤 以下是实现HTTP连接池的步骤: 步骤一:安装依赖 首先,需要安装requests和urllib3。可以使…

    http 2023年5月13日
    00
  • 关于401状态码的含义和处理方式

    以下是关于“关于401状态码的含义和处理方式”的完整攻略: 简介 HTTP状态码是Web应用中常见的一种响应状态码,401状态码是指未授权的问请求。本文将介绍401状态码的含义和处理方式,并提供两个示例说明。 含义 401状态码表示客户端未经授权,需要进行身份验证能访问资源。通常情况下,服务器会返回一个WWWAuthenticate头部,提示客端进行身份。 …

    http 2023年5月13日
    00
  • Vue+Typescript中在Vue上挂载axios使用时报错问题

    问题描述: 在使用Vue+Typescript时,将axios挂载到Vue上时出现错误,无法正常使用axios库。 解决方案: 安装相关库 首先需要安装vue、vue-property-decorator、axios和@types/axios这些库: npm install vue vue-property-decorator axios @types/ax…

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