gpt4 book ai didi

java - 汤姆EE : Forwarding request to a different war

转载 作者:行者123 更新时间:2023-12-02 09:43:20 25 4
gpt4 key购买 nike

我无法让 TomEE 将我的请求从同一个 Ear 文件转发到不同的 Web 应用程序。

我更新了 context.xml 启用的 crossContext:

<Context antiResourceLocking="false" privileged="true" crossContext="true">
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="172.17.0.1" />
-->
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>

</Context>

我转发的 Web 应用程序是一个简单的 Servlet:

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
RequestDispatcher dispatcher;
dispatcher = getServletContext().getContext("/web2").getRequestDispatcher("/webapp2/hello");
dispatcher.forward(req, resp);

} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
e.printStackTrace(pw);
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, sw.toString());
}
}

它应该转发到的 Web 应用程序是一个 Rest 资源,如下所示:

package local.gerb;

import javax.ws.rs.*;

@Path("webapp2")
public class HelloResource {

@GET
@Path("hello")
@Produces("text/plain")
public String getMessage() {
return "Rest Never Sleeps";
}
}

我确实通过 curl 特定端点来验证 webapps2 是否正常工作。

但是,当我 curl 应该转发到 webapp2 的 webapp1 时,我得到了 404。奇怪的是,如果我将 Rest 资源转换为普通 servlet,则转发工作正常。

如果你想查看代码,我已将其推送到 github: https://github.com/jstralko/tomee-fwd

我有一个自述文件,解释如何构建和运行此应用程序。它在 Docker 容器中运行,因此一切都是独立的,并且非常容易构建和运行。

最佳答案

我决定调试 TomEE 并发现此代码导致 CXFJAXRSFilter.java 中出现问题:

    @Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
if (!HttpServletRequest.class.isInstance(request)) {
chain.doFilter(request, response);
return;
}

final HttpServletRequest httpServletRequest = HttpServletRequest.class.cast(request);
final HttpServletResponse httpServletResponse = HttpServletResponse.class.cast(response);

if (CxfRsHttpListener.TRY_STATIC_RESOURCES) { // else 100% JAXRS
if (servletMappingIsUnderRestPath(httpServletRequest)) {
chain.doFilter(request, response);
return;
}
final InputStream staticContent = delegate.findStaticContent(httpServletRequest, welcomeFiles);
if (staticContent != null) {
chain.doFilter(request, response);
return;
}
}

try {
delegate.doInvoke(
new ServletRequestAdapter(httpServletRequest, httpServletResponse, request.getServletContext()),
new ServletResponseAdapter(httpServletResponse));
} catch (final Exception e) {
throw new ServletException("Error processing webservice request", e);
}
}

导致问题的行:

if (CxfRsHttpListener.TRY_STATIC_RESOURCES) { // else 100% JAXRS

所以我找到了TRY_STATIC_RESOURCES的定义

public static final boolean TRY_STATIC_RESOURCES = "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.jaxrs.static-first", "true"));

所以我将 openejb.jaxrs.static-first 的 system.property 更新为 false 并且它起作用了。

$> curl 'http://localhost:8080/web1/webapp1?op=foo'
Hello From Webapp2 Rest Resource%

我将我的更改推送到了我的 github 存储库,供我们这些一起玩的人使用。

关于java - 汤姆EE : Forwarding request to a different war,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56875899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com