gpt4 book ai didi

java - Spring MVC 应用程序中 NginX 反向代理后面的 getRemoteAddr()?

转载 作者:可可西里 更新时间:2023-11-01 16:21:52 25 4
gpt4 key购买 nike

我有 Spring MVC 应用程序,托管在 Tomcat 容器中。 Tomcat 以 NginX 为前端,因此我在 NginX 配置中明确设置了 header :

location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}

这似乎工作正常,标题在那里(我在调试器中看到它)。

现在,我尝试关注 this solution here ,带有请求包装和过滤器,但它不起作用,因为显然我自定义包装的请求对象不是 MVC 机制使用的对象。映射如下:

 <servlet-mapping>  
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<filter-mapping>
<filter-name>RealIPFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

我尝试在代码中的两个(不同)位置提取远程地址:

1)

public class PostAuthSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(
HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws IOException, ServletException {
// here
request.getRemoteAddr();
}
}


2)

public class LoginFailureEventListenter implements
ApplicationListener<AuthenticationFailureBadCredentialsEvent> {

@Override
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {
String remoteIP = null;
Object src = event.getSource();
if(src instanceof UsernamePasswordAuthenticationToken) {
UsernamePasswordAuthenticationToken upat = (UsernamePasswordAuthenticationToken) src;
if(upat.getDetails() instanceof WebAuthenticationDetails) {
// here
remoteIP = ((WebAuthenticationDetails)upat.getDetails()).getRemoteAddress();
}
}
}

用 Spring MVC 解决这个问题的正确方法是什么?

编辑
由于应用程序受到 Spring 安全性的保护,这也可能只与使 Spring 安全性接受包装请求有关,或者将此过滤器应用为处理链中的第一个过滤器,或者达到那种效果(如果可能的话)。

最佳答案

确保包装发生在 Spring 安全之前。在 spring 安全的过滤器映射之前移动包含你或包装过滤器的过滤器映射元素。

关于java - Spring MVC 应用程序中 NginX 反向代理后面的 getRemoteAddr()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20141886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com