【问题标题】:Forwarding request from one servlet to a servlet in a different war将请求从一个 servlet 转发到另一场战争中的 servlet
【发布时间】:2015-03-15 15:09:26
【问题描述】:

我有一个 EAR1。此 EAR1 内部有一个 WAR1,其上下文为“/war1”。这个 war1 有一个 servlet,里面有 '/servlet1' 的 url 映射。

在同一个 WebSphere 实例上,我有一个 EAR2。此 EAR2 内部有一个 WAR2,其上下文为“/war2”。这个 war2 里面有一个 '/servlet2' 的 servlet url-mapping。

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

现在,我需要将请求从 servlet1 转发到 servlet 2...所以,在 servlet1 内部,我正在尝试以这种方式转发请求..

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

但它失败了..

如何将请求转发到 EAR2 中的 war2 中的 servlet2。

提前致谢

【问题讨论】:

    标签: java jsp jakarta-ee servlets websphere


    【解决方案1】:

    根据您的描述,您有两个战争文件(war1war2),因此这意味着您在同一服务器中有 two 上下文。

    为了在不同的上下文中访问资源,您可以执行以下操作。

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

    【讨论】:

    • 我可以看到 'servlet2' 的请求调度程序构造良好......但之后转发似乎没有转发它..
    【解决方案2】:

    我怀疑由于 RequestDispatcher 存在于 ServletContext 上,您将无法转发到不同的 servlet。你得到什么错误?

    这里说:

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

    "ServletContext.getRequestDispatcher 方法接受一个字符串 描述 ServletContext 范围内的路径的参数。”

    查看这篇文章了解更多信息:

    ServletContext.getRequestDispatcher() vs ServletRequest.getRequestDispatcher()

    【讨论】:

    • 有趣...但是当我尝试使用 href='/war2/servlet2' 在 jsp 中转发请求时,它转发正确....不知道这里有什么区别?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多