为什么request.getRemoteUser()返回tomcat windows服务帐户有时
我试图让Windows验证与使用GWT开发的第三方应用程序一起工作。 我在tom服务器上托管应用程序。我通过IIS代理访问站点(在tomcat的文档之后安装)。为什么request.getRemoteUser()返回tomcat windows服务帐户有时
如果我修改了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;
}
}
难道我的问题被链接到这个bug谷歌的吉斯:https://github.com/google/guice/issues/780?
如果是这样,是否有任何解决办法?
HttpServletRequest.getRemoteUser()
通常只返回与CGI REMOTE_USER
变量相同的值,它是HTTP基本认证的用户名。这听起来像你希望它是一个不同的值,这意味着有些东西正在修改HttpServletRequest
对象。很可能这是通过Servlet过滤器完成的。
如果吉斯错误是罪魁祸首,它很容易解决:只需确保GuiceFilter
安装后任何过滤器进行身份验证请求,并修改HttpServletRequest
对象。
作为一般的经验法则,我不认为像这样修改请求是一个好主意,正是因为当出现问题时很难调试。相反,如果您有一个@RequestScoped
提供程序从您的请求中提取出您想要的值并进行了所需的任何验证,您可以通过依赖注入来消费用户信息。或者更一般地说:总是倾向于创建新的(最好是不可变的)值而不是改变现有的对象 - 它使得控制流程更容易推理。
我在这里重新表述了我的问题:http://stackoverflow.com/questions/38664679/request-getremoteuser-returns-a-different-login-in-jsp-than-in-a-servlet-filt,经过附加测试排除问题出现在guice/gwt的可能性。 – Laloutre