gpt4 book ai didi

java - 为什么 request.getRemoteUser() 有时会返回 tomcat Windows 服务帐户

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:57:32 29 4
gpt4 key购买 nike

我正在尝试让 Windows 身份验证与使用 GWT 开发的第 3 方应用程序一起使用。我在 Windows 服务器上使用 tomcat 托管该应用程序。我通过 IIS 代理(按照 tomcat 的文档安装)访问该站点。

如果我修改 webapp 的 .jsp 以显示 "<%= request.getRemoteUser() %>",我会得到我想要的用户名,我的 Windows 帐户。

但是 webapp 使用我在服务器上安装 Tomcat windows 服务的帐户对我进行身份验证。

在 webapp 的(反编译)源代码中,我看到了对完全相同的“request.getRemoteUser()”的调用,所以我想知道区别在哪里。

下面是反编译的类:

import javax.servlet.http.HttpServletRequest;

public class RemoteUserLoginProvider
extends BaseRequestLoginProvider
{
public String extractLoginFromRequest(HttpServletRequest request)
{
return request.getRemoteUser();
}
}

和:

import com.google.inject.Inject;
import com.google.inject.Provider;
import javax.servlet.http.HttpServletRequest;

public abstract class BaseRequestLoginProvider
implements Provider<String>
{
@Inject
private Provider<HttpServletRequest> requestProvider;

public abstract String extractLoginFromRequest(HttpServletRequest paramHttpServletRequest);

public String get()
{
HttpServletRequest request = (HttpServletRequest)this.requestProvider.get();
String userlogin = extractLoginFromRequest(request);

return userlogin;
}
}

我的问题是否与谷歌 guice 上的这个错误有关:https://github.com/google/guice/issues/780

如果是这样,有什么变通办法吗?

最佳答案

HttpServletRequest.getRemoteUser() 通常只返回与 CGI REMOTE_USER 变量相同的值,即来自 HTTP 基本身份验证的用户名。听起来您希望它是一个不同的值,这意味着某些东西正在修改 HttpServletRequest 对象。这很可能是由 Servlet 过滤器完成的。

如果那个 Guice bug 是罪魁祸首,那么它很容易变通:只需确保在 之后安装 GuiceFilter,无论 Filter 对请求进行身份验证并修改 >HttpServletRequest 对象。

根据一般经验,我不认为这样修改请求是个好主意,正是因为出现问题时很难调试。相反,如果您有一个 @RequestScoped 提供程序从请求中提取您想要的值并执行您需要的任何身份验证,则您可以通过依赖注入(inject)来使用用户信息。或者,更一般地说:总是更喜欢创建新的(最好是不可变的)值而不是改变现有对象——它使控制流更容易推理。

关于java - 为什么 request.getRemoteUser() 有时会返回 tomcat Windows 服务帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38644245/

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