java - 如何在 Spring Boot 中获取请求的客户端 IP 地址?
问题描述
我的安全配置有问题,我需要创建一个访问我的应用程序的 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。
我尝试在我的控制器类中自动装配它,但我的应用程序没有执行。我能做些什么来完成这项工作?
解决方案
我使用了一种不同的方式来获取我的客户请求的地址。
我创建了一个名为 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,在这种情况下,请求将不会执行。但是对于这种用法,弹簧靴还有其他方法。
如果我做错了什么,请纠正我。
推荐阅读
- python - 如何从 pymysql.cursor.description 获取所有数据类型的映射?
- node.js - MERN App在digitalocean中出现连接错误
- python - 图没有在 Jupyter 笔记本中使用 Matplotlib 填充交互式绘图中的画布
- python - Pandas - 从另一个数据帧返回最近的日期时间
- node.js - Docker 容器运行节点进程在等待对长请求的响应时终止
- sql - 如何在 Oracle 中创建具有特定 SQL 选择输出的过程?
- python - Pandas 从 CSV 中旋转并添加具有连续行的列
- python - geopandas没有属性clip
- python - urllib 请求给出 404 错误,但在浏览器中工作正常
- java - 如何修复错误:致命异常:java.lang.NoClassDefFoundError