小编典典

在不修改应用程序的情况下从Tomcat中的HttpServletRequest.getRemoteUser()获取值

tomcat

(使用Java 6和Tomcat6。)

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

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

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


阅读 352

收藏
2020-06-16

共1个答案

小编典典

这是一个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容器中使用。

2020-06-16