从Tomcat中的HttpServletRequest.getRemoteUser()获取值,而无需修改应用程序


问题内容

(使用Java 6和Tomcat6。)

有没有一种方法可以让我HttpServletRequest.getRemoteUser()在开发环境(即本地主机)中返回值而无需修改应用程序的web.xml文件?

我问的原因是,将应用程序部署到远程环境时的身份验证实现是由Web服务器和插入式工具处理的。在本地运行我显然没有插件工具或单独的Web服务器;我只有Tomcat6。我试图避免仅仅为了支持本地主机上的开发而向应用程序中添加代码。

我希望可以对context.xml或server.xml文件进行修改,以使我可以设置远程用户ID,或者尝试从HTTP标头或其他内容中提取它。


问题答案:

这是Valve做到这一点的概念证明:

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<String> roles = new ArrayList<String>();

            // 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

<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true">

    <Valve className="remoteuservalve.RemoteUserValve" />
...

我想它也可以在EngineContext容器中使用。

更多信息: