如何在Spring Boot中获取请求的客户端IP地址?

问题描述 投票:1回答:1

我的安全配置遇到问题,我需要创建访问我的应用程序的Ip的列表。

我的问题是为我的所有应用程序请求以动态方式获取Ip。但是我不想为我的应用程序的所有请求添加HttpServletRequest,我想要的是在每个请求之前甚至在SecurityConfig事件之前都调用的方法。

我试图做的是使用AuthenticationProvider获取请求HttpServletRequest,然后获取客户端的Ip。问题是我找不到创建单个类的方法,它无法连接到我的所有请求。这是我的代码:

public abstract class IPAddressBasedAuthenticationProvider implements AuthenticationProvider {

  /**
   * Context http request
   */
  @Autowired
  private HttpServletRequest request;

  @Override
  public Authentication authenticate(Authentication authentication) throws AuthenticationException {

      String ipAddress = request.getRemoteAddr();
      System.out.println(ipAddress);
      return authentication;
  }
}

我在想的是,我的请求将在此代码中传递,然后显示我的客户IP。

我曾尝试在控制器类中自动装配,但那时我的应用程序无法执行。我该怎么做才能使这项工作有效?

java spring spring-boot servlets
1个回答
1
投票

我使用了另一种方法来获取我的客户请求的地址。

我创建了一个名为WebConfig的类,该类实现了WebMvcConfigurer。该类在spring中配置一些用法。这是此类的代码:

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggerInterceptor());
    }
}

此方法正在注册一个拦截器,此拦截器将拦截请求,并使用您创建的方法在发送某些请求时执行它。例如我的代码:

public class LoggerInterceptor extends HandlerInterceptorAdapter {

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

        System.out.println(request.getRemoteAddr());
        return true;
    }
}

就我而言,我已经使用“ preHandle”方法来获取我的客户端请求的Ip,每次有人通过请求调用我的应用程序时都会调用此方法,在spring处理请求之前,我的方法可以用作以及安全配置,因为您可以返回false,在这种情况下,请求将不会执行。但是对于这种用法,Spring Boot还有其他方法。

如果我做错了,请纠正我。

© www.soinside.com 2019 - 2024. All rights reserved.