当前位置: 首页 > 面试题库 >

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

端木明贤
2023-03-14
问题内容

(使用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容器中使用。

更多信息:

  • 阀门组件
  • 阀门Javadoc


 类似资料:
  • 有什么想法可以解决这个问题吗?谢谢。

  • 我已经在谷歌云功能中构建了API。当我试图直接获取API时,会出现CORS错误。虽然我添加了,但失败了。 来自“http://localhost:3000”的“https://xxxxxxxx.com”已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上没有“access-control-allog-origin”标头。如果一个不透明的响应满足您的需要,请将请求的模式设置为“n

  • 我面临一个场景,我需要更新参数,并希望在同一事务中检索修改后的值 例如: 我的问题是,我们不能在同一事务中从bean本身检索修改后的值,而不是提交内部事务(即新事务)并从DB中检索它吗?

  • 获得并应用修改 编译qemu还会用到的库文件有 libsdl1.2-dev 等。安装命令如下: sudo apt-get install libsdl1.2-dev # 安装库文件 libsdl1.2-dev 获得 qemu 的安装包以后,对其进行解压缩(如果格式无法识别,请下载相应的解压缩软件)。 例如 qemu.tar.gz/qemu.tar.bz2 文件,在命令行中可以使用: tar

  • 问题内容: 我正在寻找一种无需上传文件即可在Servlet过滤器中获取HTTP多部分请求的表单参数的方法。 request.getParameterMap()返回空。我了解这是因为请求包含多个部分。 我已经看过commons.HttpFileUpload,但是对于我的情况来说这似乎有些过分了。在此过滤器中,我仅对常规参数感兴趣,并且还不想处理文件上载。 编辑:主要问题是我需要在过滤器堆栈的下方有一

  • 我正在处理使用通知侦听器服务类从通知中读取数据的应用程序。我已完成文本部分,但无法存储通知中收到的图像。 我想存储在WhatsApp应用程序中从通知中收到的图像。我已经尝试了堆栈溢出的所有解决方案,但没有得到任何解决方案。我已经尝试了<代码>通知。EXTRA_PICTURE但它总是返回null。 我见过许多应用程序这样做,但看起来我错过了一些东西。 因此,如果有人能以任何方式提供帮助,我们将不胜感