TomEE: переадресация запроса на другую войну - PullRequest
0 голосов
/ 03 июля 2019

У меня проблемы с тем, чтобы TomEE перенаправил мой запрос в другое веб-приложение из того же файла ушей.

Я обновил 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>

Веб-приложениея пересылаю простой сервлет:

    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());
            }
    }

Веб-приложение, на которое он должен быть перенаправлен, является ресурсом отдыха, который выглядит следующим образом:

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 работает, скручивая конкретную конечную точку.

Однако, когда я скручиваю webapp1, который должен пересылать в webapp2, я получаю 404. Что странно, если я преобразую Res Resource в простой сервлет, переадресация работаетотлично.

Если вы хотите увидеть код, который я отправил на github: https://github.com/jstralko/tomee-fwd

У меня есть ReadMe, объясняющий, как создать и запустить это приложение.Он работает в док-контейнере, поэтому все является автономным и супер простым в сборке и запуске.

1 Ответ

1 голос
/ 03 июля 2019

Я решил отладить 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"));

Поэтому я обновил system.property openejb.jaxrs.static-first до false, и это сработало.

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

Я внес свои изменения в репозиторий github для тех из нас, кто играет вместе.

...