问题标签 [tomcat-valve]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
7561 浏览

java - org.apache.coyote.AbstractProtocol$ConnectionHandler.process 读取请求时出错,被忽略

使用 Tomcat 服务器 8.5.4 作为独立服务 (tomcat8w.exe),当我停止服务器时,我在“logs/tomcat8-stderr.YYYY-MM-DD.txt”中收到以下错误:

我的连接器如下:

您对这里可能出现的问题有任何解释吗?

0 投票
0 回答
192 浏览

java - Tomcat Realm 在 Valve 之后调用

我需要你的帮助。我为 tomcat 开发了一个自定义阀门,它拦截特定用户对特定 URI 的请求(一种授权),但它应该只在我的 JDBCRealm 之后调用。到目前为止,我尝试了很多来在我的 server.xml 中配置此行为,但它不起作用。我的 Valve 总是在 Realm 之前被调用。

Realm 在引擎级别定义,Valve 在主机级别定义......我认为 tomcat 链会为我处理这个订单。

你能帮我让它运行吗?

0 投票
1 回答
2092 浏览

tomcat - Tomcat阀门重写不起作用

我想将静态资源以外的任何链接(例如 js、图像等)指向我的 index.html。我做了以下更改。

我添加了一个context.xmlinapp.war/META-INF目录,其中包含:

rewrite.configapp.war/WEB-INF目录中也包含:

但是,通过上述设置,我的所有 js 和 css 文件都会显示index.html内容(在浏览器控制台中)。你能建议这里有什么问题吗?

0 投票
1 回答
62 浏览

javascript - 通过 Tomcat 阀启用重写后,Javascript 被加载两次

我有一个单页应用程序,我正在使用 tomcat 重写阀将静态资源以外的所有请求转发到我的 index.html。以下是我的 rewrite.config 的内容:

在重写工作后,我看到我的 jQuery 库和其他 javascript 文件加载了两次。这导致应用程序中断。有人能指出这个问题的潜在根本原因是什么吗?

0 投票
0 回答
157 浏览

jboss7.x - 打包时如何从maven依赖中排除jar?

我正在尝试打包一个包含阀门的 jboss AS7.5 模块(RedHat EAP 6.4)。该阀门需要绑定到 tomcat-catalina-xyzjar 随附的 AuthenticatorBase,据我所知,它本身并不是一个可下载的模块。所以,我需要将该 jar 构建到我的模块中,使用 maven 插件来打包依赖项。

问题是,依赖项 org.apache.tomcat:tomcat-catalina:xyz 的 GAV 包括 AS 中包含的库,即 servlet 库。如果我打包 catalina 依赖项,使用执行此操作的 maven 插件,我会得到一堆不必要的 jar,它们会在运行时破坏我的模块。

有没有办法

  1. 只打包我想要的罐子?
  2. 找到一个不同的依赖项,它只包含 tomcat 阀门(即,包含 org.apache.catalina.authenticator.AuthenticatorBase 的 jar)绑定?

或者,最好是否有一个已经存在用于此目的的模块,我可以在我的 module.xml 文件中将其作为模块依赖项引用?

包括jars:tomcat-catalina、tomcat-servlet、tomcat-juli、tomcat-annotations等。

如何在我的打包模块中只获取 tomcat-catalina.jar?

0 投票
2 回答
1432 浏览

java - 在 Tomcat 自定义阀门中包装请求以允许读取请求正文

我被要求开发一个 Tomcat 阀门来记录所有 HTTP 请求,包括它们的主体。由于包含主体的流只能读取一次,我发现我需要包装请求。我在这里找到了一个基于 JBOSS 的示例(下载链接“Maven project for a Valve that dumps full request with body”):

https://bz.apache.org/bugzilla/show_bug.cgi?id=45014

我对它进行了调整,使其适用于原版 Tomcat 和更多最新的 API(我使用的是 tomcat-catalina:8.5.20)。

这是我的阀门的样子:

现在RequestWrapper,正如您想象的那样,它只是代理对包装对象的调用,除了GetRequest: 以下是该类的相关部分:

所以下一部分是LoggingRequest包装内部的RequestFacade

请注意我将输入流分配给is变量的行。这就是我在下面描述的问题开​​始的地方。

最后,包装器ServletInputStream- 如您所见,其想法是,当从实际的 Tomcat 应用程序读取主体时,将读取的字节也写入缓冲区,然后可以通过该getPayload()方法再次读取该缓冲区。我剥离了代码的明显部分,如果您想查看所有详细信息,您可以在链接的示例项目中找到它,我从中获得了所有这些:

到目前为止一切顺利,我得到了这个实际工作。我编写了一个非常简单的 Spring 应用程序,其中包含一个基本的 POST 请求方法,我从 Postman 调用它来测试它。这很简单:

我用我的 Postman 测试请求发送了一个正文,我得到了我从电话中发回的正文 - 我的阀门也能够读取正文并记录它。

但是当我想将它与应该使用的实际 Tomcat 应用程序一起使用时,它就不起作用了。该应用程序似乎无法再读取请求的正文。我可以在我的日志中看到流的read()方法从未被调用。所以我尝试了另一个应用程序——为此我只是使用了 Tomcat 管理器应用程序并将 Web 应用程序的会话过期设置为另一个值(这也是一个非常简单的 POST 请求)。它也不起作用......包含新超时值的主体永远不会到达 Tomcat 应用程序。但它适用于我自己的 Spring 应用程序。

还记得我上面提到的这条线吗?

我将这一行作为原因进行了跟踪 - 只要我在该行中发表评论,无论我是否注释掉该行之后的任何代码,都会出现问题 - 目标应用程序现在无法再读取流. 但我只在这里获取请求对象引用并将其分配给另一个变量。我实际上并没有在这里阅读流。

我有点迷茫,如果有任何想法在这里可能有问题,我会很高兴。

哦,目标 tomcat 版本是 8.0.46,而我使用的是 9.0 和 8.5(在所有三个上进行了测试,结果相同)。


编辑:对我的包装对象的记录调用


编辑:我在https://github.com/codekoenig/RequestLoggerValve添加了一个示例项目

0 投票
1 回答
1350 浏览

tomcat - 我的自定义 tomcat 阀门没有被拦截

这是我编写的自定义阀门类。它所做的只是在登录访问日志文件之前屏蔽密码...

我将其构建为 value-lib.jar 并复制到 $TOMCAT_HOME/lib 文件夹。

然后我在 localhost 下自定义了 server.xml 中的登录条目如下

现在,我的所有日​​志请求都像这样正确记录在 localhost_access_log.2018-02-12.txt 文件中

我面临的问题是,当我将诸如 password=123 之类的参数传递给这样的 URL 时,例如http://localhost:8080?password=123

我希望将其记录为

现在记录为

密码值没有发生屏蔽。我尝试通过远程 Java 应用程序在 Eclipse 中为 jar 放置一个调试器,其中 Tomcat 以“jpda start”模式启动。

在那里我根本看不到控制权转移到这个班级。

所以,我对它的工作原理有点困惑,因为它从我添加到 server.xml 的 XML 配置中获取日志格式,但在同一个 XML 配置中,我提到类名为“com.test.FilteredAccessLogValve”,但那不被选中

0 投票
1 回答
315 浏览

tomcat - 访问日志分析@Tomcat

我们在 server.xml 文件中启用了以下访问日志模式pattern="%h %H %l %u %t "%r" %s %b location: %{location}o"

有人可以帮助理解模式中的参数,然后从下面提到的日志中进行分析。

0 投票
1 回答
766 浏览

java - Spring Boot Embedded Tomcat 中的自定义 SAML 身份验证阀 - 不要应用于执行器端点

旧的共享 Tomcat 方法

我有一个自定义的 SAML 2.0 身份验证阀,我目前在一些独立的 tomcat Web 服务器中使用它来实现单点登录。

为了实现这一点,我们将阀门添加到 tomcat 服务器的 context.xml 中,如下所示(使用一些示例值而不是实际值):

然后,我们将根据 web.xml 控制需要保护哪些端点。

新的 Spring Boot 嵌入式 Tomcat 方法

现在,我们在通过 spring boot 嵌入式 tomcat 运行的独立 spring boot 应用程序中使用这个阀门。我们通过 java 配置在这些应用程序中添加相同的自定义身份验证阀:

然后我们需要在 UserPrincipal 中包含某些角色才能访问应用程序。这再次通过 java 配置设置(角色从 application.properties 中提取):

问题

这很好用——新的 Spring Boot 应用程序会将任何传入请求重定向到 IdP 以进行身份​​验证,然后 IdP 将 SAML 响应发布回最初请求的 URL,并且页面按预期加载。

问题是,我们启用了需要绕过该身份验证的 Spring Boot 执行器端点。具体来说,我们需要/actuator/health不安全的健康检查端点,以便它可以用作 kubernetes 的就绪探测。

我无法确定ServletSecurity在每个请求路径的基础上应用它的方法,因此我们不需要对/actuator/*路径的任何请求进行任何身份验证。

这样的事情可能吗?

0 投票
1 回答
475 浏览

java - Tomcat 阀强制特定的 Cache-Control 标头

我想在我的回复中正确设置 Cache-Control 和 ETag 标头。为此,我通过 spring 安全配置禁用了请求缓存:

然后在返回响应时:

从某种意义上说,似乎没有返回默认的 spring 安全缓存控制标头(默认情况下,我认为它们返回“no-cache,no-store,max-age=0,must-revalidate”)并且我的标头是出现在响应中。但是还有其他东西:

较低的缓存头是我的,但顶部的是不需要的。它们似乎来自org.apache.catalina.authenticator.AuthenticatorBase其中似乎是正在使用的嵌入式 Tomcat 的一部分。我一直无法找到访问和修改这个特定类的配置的方法。

请告知如何摆脱不需要的标题。

我在 Spring Boot 1.5.18.RELEASE