如何在Spring Boot中拦截HTTP请求响应
#教程 #java #spring #springboot

弹簧中的拦截器用于拦截客户端请求或响应在由控制器处理或在将响应发送回客户端之前。

拦截器是Spring Web MVC框架的一部分,并提供了一种将预/后处理逻辑添加到您的应用程序的请求响应生命周期的方法。

在此处通过此完整的视频教程学习拦截器。

拦截器的实时用例

拦截器的一些常见用例包括:

  • 记录:可以使用拦截器来记录HTTP请求和响应。这对于调试或跟踪应用程序的性能很有用。
  • 安全性:可以使用拦截器来执行安全策略。例如,可以使用拦截器来检查用户在允许其访问资源之前已进行身份验证。
  • 缓存:可以使用拦截器来缓存HTTP请求和响应。这可以通过减少需要向基础资源提出请求的次数来提高应用程序的性能。
  • 转换:可以使用拦截器来转换HTTP请求和响应。例如,拦截器可用于将JSON请求转换为XML响应。

春季请求生命周期

在典型的弹簧启动应用程序流中,当客户端将HTTP请求发送到特定端点(URL)时,请求首先由Web服务器(例如Apache Tomcat或Jetty)接收到,然后转发到Spring Boot应用程序。

调度器servlet是Spring Boot应用程序中传入请求的切入点。一旦DispatcherServ收到请求,它就会咨询处理。

处理程序负责确定哪个控制器应基于控制器中定义的URL映射处理传入请求。

Interceptors in Spring Boot

在Spring Boot中创建拦截器

要在Spring Boot中创建拦截器,您通常会创建一个实现 HandlerInterceptor 接口的类。

HandlerInterceptor 接口具有三种方法:

  1. preHandle() :prehandle()方法是处理程序中最重要的方法。在调用实际控制器方法之前执行此方法。它返回一个布尔值,指示请求是否应继续到控制器或停止。

  2. postHandle() :在调用控制器方法后但在发送响应发送给客户端之前执行此方法。它允许您在呈现响应之前修改模型并查看。您可以使用此方法执行请求处理后需要执行的任何任务。例如,您可以使用postHandle()方法将其他信息添加到响应中,或记录响应。

  3. afterCompletion() :将响应发送给客户端后执行此方法。即使在请求处理过程中抛出了例外,该方法也会被调用。这对于清理或资源发布任务很有用。

拦截器检查基本身份验证

现在让我们创建一个拦截器来执行基本的身份验证检查。此拦截器将仅针对特定的/products/new端点调用。它将在允许访问控制器之前进行基本的身份验证检查。

在此示例中,我们将进行硬编码一个用户名和密码以验证用户传递的凭据。

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

@Slf4j
public class BasicAuthInterceptor implements HandlerInterceptor {
    private static final String USERNAME = "admin";
    private static final String PASSWORD = "admin";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("BasicAuthInterceptor::preHandle()");

        String authHeader = request.getHeader("Authorization");
        if (authHeader != null && authHeader.startsWith("Basic ")) {

            String base64Credentials = authHeader.substring("Basic ".length());
            byte[] decodedCredentials = Base64.getDecoder().decode(base64Credentials);
            String credentials = new String(decodedCredentials, StandardCharsets.UTF_8);

            String[] parts = credentials.split(":");
            String username = parts[0];
            String password = parts[1];

            if (USERNAME.equals(username) && PASSWORD.equals(password)) {
                return true;
            }
        }

        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("BasicAuthInterceptor::postHandle()");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("BasicAuthInterceptor::afterCompletion()");
    }
}

在春季启动中注册拦截器

创建自定义拦截器后,您需要使用 WebMvcConfigurer 配置向Spring Boot应用程序注册它:

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 WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new BasicAuthInterceptor())
                .addPathPatterns("/products/new");
    }
}

本教程首次在stacktips.com上发布。如果您喜欢这篇文章,请在Twitter @ask_nilan上关注我或查看我的YouTube频道@TheTechMojo以获取更多此类内容。

快乐学习!