在Tomcat中从HttpServletRequest.getRemoteUser()获取值而不修改应用程序

(使用Java 6和Tomcat 6.)

我有没有办法让HttpServletRequest.getRemoteUser()在我的开发环境(即localhost)中返回一个值而无需修改我的应用程序的web.xml文件?

我问的原因是,当应用程序部署到远程环境时,身份validation实现由Web服务器和插件工具处理。 在本地运行我显然没有插件工具或单独的Web服务器; 我只是拥有Tomcat 6.我试图避免向我的应用程序添加代码仅仅是为了支持我的localhost上的开发。

我希望我可以对context.xml或server.xml文件进行修改,这些修改将允许我设置远程用户ID或尝试从HTTP标头或其他东西中提取它。

以下是Valve实现的概念validation:

 import java.io.IOException; import java.security.Principal; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.realm.GenericPrincipal; import org.apache.catalina.valves.ValveBase; public class RemoteUserValve extends ValveBase { public RemoteUserValve() { } @Override public void invoke(final Request request, final Response response) throws IOException, ServletException { final String username = "myUser"; final String credentials = "credentials"; final List roles = new ArrayList(); // Tomcat 7 version final Principal principal = new GenericPrincipal(username, credentials, roles); // Tomcat 6 version: // final Principal principal = new GenericPrincipal(null, // username, credentials, roles); request.setUserPrincipal(principal); getNext().invoke(request, response); } } 

(使用Tomcat 7.0.21测试。)

编译它,将它放在jar中并将jar复制到apache-tomcat-7.0.21/lib文件夹。 您需要修改server.xml

   ... 

我想它也适用于EngineContext容器。

更多信息:

  • 阀门组件
  • 阀门javadoc

使用本地的基于文件的领域进行测试。 检查conf/tomcat-users.xml并为您的应用程序创建角色和用户,并在web.xml中启用安全性约束。 tomcat-users.xml有很好的例子。