简体   繁体   English

将请求从一个 servlet 转发到另一场战争中的 servlet

[英]Forwarding request from one servlet to a servlet in a different war

I have an EAR1.我有一个 EAR1。 This EAR1 has a WAR1 inside it, with a context of '/war1'.该 EAR1 内部有一个 WAR1,上下文为“/war1”。 This war1 has a servlet with url-mapping of '/servlet1' inside it.这个war1有一个servlet,里面有'/servlet1'的url映射。

On the same instance of WebSphere, I have an EAR2.在 WebSphere 的同一个实例上,我有一个 EAR2。 This EAR2 has a WAR2 inside it, with a context of '/war2'.该 EAR2 内部有一个 WAR2,上下文为“/war2”。 This war2 has a servlet url-mapping of '/servlet2' inside it.这个war2里面有一个'/servlet2'的servlet url-mapping。

EAR1---- WAR 1 --- Servlet1
EAR2---- WAR 2 --- Servlet2

Now, I need to forward request from servlet1 to servlet 2...So, Inside servlet1, I am trying to forwrd the request this way..现在,我需要将请求从 servlet1 转发到 servlet 2...所以,在 servlet1 内部,我试图以这种方式转发请求。

getServletContext().getRequestDispatcher("/war2/servlet2").forward(request, response);

but it is failing..但它失败了..

how do I forward request to servlet2 that is in war2 that is in EAR2.如何将请求转发到 EAR2 中的 war2 中的 servlet2。

Thanks in advance提前致谢

I suspect that since the RequestDispatcher lives on the ServletContext, you won't be able to forward to a different servlet.我怀疑由于 RequestDispatcher 位于 ServletContext 上,因此您将无法转发到不同的 servlet。 What error do you get?你得到什么错误?

It says here:它在这里说:

http://java.boot.by/wcd-guide/ch03s05.html http://java.boot.by/wcd-guide/ch03s05.html

"The ServletContext.getRequestDispatcher method takes a String argument describing a path within the scope of the ServletContext." “ServletContext.getRequestDispatcher 方法采用 String 参数来描述 ServletContext 范围内的路径。”

See this post for more information:有关更多信息,请参阅此帖子:

ServletContext.getRequestDispatcher() vs ServletRequest.getRequestDispatcher() ServletContext.getRequestDispatcher() 与 ServletRequest.getRequestDispatcher()

As per your description,you have two war files( war1 ,and war2 ),so it means you are having two context in same server.根据您的描述,您有两个战争文件( war1war2 ),因此这意味着您在同一服务器中有two上下文。

In order to access the resource in different context you can do below.为了在不同的上下文中访问资源,您可以在下面执行。

ServletContext ctx = request.getServletContext().getContext("/war2");
RequestDispatcher dispatcher = ctx.getRequestDispatcher("/servlet2");
dispatcher.forward(request, response);

I do it with HttpUrlConnection as below:我使用 HttpUrlConnection 进行操作,如下所示:

// variable methodType is GET or POST in method call below

private void sendToAnotherServletInDifferentWar(HttpServletRequest request, HttpServletResponse response, String methodType) throws IOException
    {
        HttpURLConnection conn = null;
       
        // replace/modify the path as per the path you want to hit.

        String pathToAnotherServlet = "http://localhost:8080/<war2-context>/<servlet-path>/<path-Info>";
        final URL url = new URL(pathToAnotherServlet);

        try
        {
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod(methodType);

            final Enumeration<String> headers = request.getHeaderNames();
            while (headers.hasMoreElements())
            {
                final String header = headers.nextElement();
                final Enumeration<String> values = request.getHeaders(header);
                while (values.hasMoreElements())
                {
                    final String value = values.nextElement();
                    System.out.println("header-> " + header + ": value-> " + value);
                    conn.addRequestProperty(header, value);
                }
            }

            conn.setUseCaches(false);
            conn.setDoInput(true);
            conn.setDoOutput(false);
            conn.connect();

            final byte[] buffer = new byte[16*1024];

            response.setStatus(conn.getResponseCode());
            System.out.println("HTTP Response Code obtained from service " + conn.getResponseCode());
            if(conn.getResponseCode() == HttpServletResponse.SC_OK)
            {
                for (int i = 0; ; ++i)
                {
                    final String header = conn.getHeaderFieldKey(i);
                    if (header == null)
                        break;
                    final String value = conn.getHeaderField(i);
                    response.setHeader(header, value);
                }

                while (true)
                {
                    final int read = conn.getInputStream().read(buffer);
                    if (read <= 0)
                        break;
                    response.getOutputStream().write(buffer, 0, read);
                }
            }
            else {
                response.sendError(conn.getResponseCode(), conn.getResponseMessage());
            }
        }
        catch (IOException e)
        {
            logger.error("Calling service Failed with cause ", e);
            if(conn != null)
                response.sendError(conn.getResponseCode(), e.getMessage());
            else
                response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM