如何在 Spring Boot 中获取请求的客户端 IP 地址?
How can I get the client IP address of requests in Spring Boot?
我的安全配置有问题,我需要创建一个正在访问我的应用程序的 Ip 的列表。
我的问题是以动态方式为我的所有应用程序请求获取 Ip。
但是我不想为我的应用程序的所有请求添加一个 HttpServletRequest,我想要的是一个在每个请求之前调用的方法,甚至在 SecurityConfig 事件之前。
我尝试做的是使用 AuthenticationProvider 获取请求 HttpServletRequest,然后获取我的客户端的 Ip。问题是我找不到创建单个 class 的方法,它连接到我的所有请求。这是我的代码:
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。
我尝试在我的控制器中自动装配它 classes 但我的应用程序当时没有执行。
我该怎么做才能完成这项工作?
我使用了不同的方法来获取我的客户端请求的地址。
我创建了一个名为 WebConfig 的 class 来实现 WebMvcConfigurer。这个class配置了spring中的一些用法。这是 class:
的代码
@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 处理我的请求之前,都会调用此方法方法被调用,它也可以用作安全配置,因为你可以 return false,在这种情况下请求将不会执行。但是对于这种用法还有其他方法 spring boot.
如果我做错了什么,请指正。
我的安全配置有问题,我需要创建一个正在访问我的应用程序的 Ip 的列表。
我的问题是以动态方式为我的所有应用程序请求获取 Ip。 但是我不想为我的应用程序的所有请求添加一个 HttpServletRequest,我想要的是一个在每个请求之前调用的方法,甚至在 SecurityConfig 事件之前。
我尝试做的是使用 AuthenticationProvider 获取请求 HttpServletRequest,然后获取我的客户端的 Ip。问题是我找不到创建单个 class 的方法,它连接到我的所有请求。这是我的代码:
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。
我尝试在我的控制器中自动装配它 classes 但我的应用程序当时没有执行。 我该怎么做才能完成这项工作?
我使用了不同的方法来获取我的客户端请求的地址。
我创建了一个名为 WebConfig 的 class 来实现 WebMvcConfigurer。这个class配置了spring中的一些用法。这是 class:
的代码@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 处理我的请求之前,都会调用此方法方法被调用,它也可以用作安全配置,因为你可以 return false,在这种情况下请求将不会执行。但是对于这种用法还有其他方法 spring boot.
如果我做错了什么,请指正。