![](/img/trans.png)
[英]Forwarding request from one servlet to a servlet in a different war
[英]TomEE: Forwarding request to a different war
我無法讓TomEE將我的請求從同一個耳朵文件轉發到另一個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>
我要轉發的webapp是一個簡單的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());
}
}
應該轉發到的webapp是一個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";
}
}
我確實通過卷曲特定端點來驗證webapps2是否正常工作。
但是,當我卷曲應該轉發到webapp2的webapp1時,得到了404。奇怪的是,如果我將Rest Resource轉換為普通的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存儲庫的更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.