Что касается запроса пересылки ресурса с помощью Requestdispatcher [duplicate]

Это очень просто. Просто используйте

$result = $data1 . $data2;

В PHP . (concatenate) как дополнение.

1
задан Paul Taylor 19 November 2012 в 23:37
поделиться

3 ответа

Это по соображениям безопасности по умолчанию невозможно. Сначала необходимо настроить Tomcat, чтобы включить ServletContext текущего webapp в другие веб-приложения. Это нужно сделать, установив атрибут crossContext в context.xml на true.

<Context ... crossContext="true">

После этого вы можете использовать ServletContext#getContext() , чтобы получить другой контекст сервлета по его пути контекста и, наконец, использовать RequestDispatcher, как обычно ServletContext#getRequestDispatcher() .

Например

ServletContext otherContext = getServletContext().getContext("/otherContext");
otherContext.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);
2
ответ дан BalusC 22 August 2018 в 20:48
поделиться
  • 1
    Привет, спасибо, что часть делает работу, однако причина, по которой я хочу это сделать, так это, что webapp2, но может поместить некоторые данные в объект сеанса, используя putAttribute, а затем вытащить его в webapp1, но webapp1 не может найти данные, я обновим вопрос на примере – Paul Taylor 19 November 2012 в 14:19
  • 2
    Это, конечно же, будет работать только в том случае, если они используют одну и ту же HTTP-сессию. Это также необходимо настроить на стороне сервера. Если все веб-приложения запускаются в одном домене, просто установите для атрибута sessionCookiePath для всех контекстов Webapp значение /, чтобы все веб-клиенты имели один и тот же сеанс HTTP. Если это, тем не менее, создает проблемы с дизайном, тогда сохраните его в общем хранилище данных, например, в области приложения или в базе данных. – BalusC 19 November 2012 в 14:22
  • 3
    Я думал, сессия была сохранена с просьбой, нет? Просто попробовал stackoverflow.com/questions/3980392/… , но не сделал никакой разницы – Paul Taylor 19 November 2012 в 14:38
  • 4
    Запрос текущего webapp во время отправки заменяется запросом, специфичным для другого webapp. В противном случае он содержал бы неправильную информацию, приводящую к возможным неприятным ошибкам. Просто сохраните общие данные в области приложения или БД. Вы можете передать уникальный идентификатор в качестве параметра запроса. – BalusC 19 November 2012 в 14:45
  • 5
    Отмечен ваш ответ правильно, но, пожалуйста, дайте мне понять, как я могу хранить в области приложения – Paul Taylor 19 November 2012 в 14:47

Я не уверен в разных контейнерах сервлетов. Но он работает для одного контейнера с помощью метода getServletContext (). GetContext ().

Сначала вам нужно внести изменения в файл ниже

(Windows) C: \ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ conf \ context.xml Установите значение crossContext в true.

context.xml

<Context crossContext="true">

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->

</Context>

Обратите внимание, что crossContext = "true".

Предположим, у вас есть два веб-приложения с именем InterServletComm1 и InterServletComm2 с сервлетами Servlet1 и Servlet1 в каждом веб-приложение, соответственно. Затем код в каждом сервлете выглядит следующим образом:

Servlet1.java

package interServletComm1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet1
 */
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet1() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();

        request.setAttribute("name", "WebApp1");
        ServletContext context = getServletContext().getContext("/InterServletComm2");
        RequestDispatcher rd = context.getRequestDispatcher("/Servlet2");
        rd.forward(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

Servlet2.java

package interServletComm2;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet2
 */
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet2() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        String name = (String) request.getAttribute("name");
        pw.println("This is web application 2.");
        pw.println("<br>The value received from web application one is: " + name);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

Выше кода отправляет атрибут имя из InterServletComm1 , и оно получено в InterServletComm2 . Пожалуйста, дайте мне знать, если этот ответ не ясен.

1
ответ дан Abhijeet Ashok Muneshwar 22 August 2018 в 20:48
поделиться

Да.

Первое, что вам нужно сделать, это получить ServletContext для другого webapp. Вы делаете это с помощью ServletContext::getContext по своему усмотрению ServletContext, передавая путь к контексту другого webapp.

Затем вы просто выполняете ServletContext::getRequestDispatcher как обычно в чужом контексте.

Я на самом деле не пробовал это, но я 100% гарантирую, что он будет работать.

1
ответ дан Tom Anderson 22 August 2018 в 20:48
поделиться
  • 1
    На самом деле это не сработало, пока я не установил поле crossContext, как описано в другом ответе – Paul Taylor 19 November 2012 в 22:27
Другие вопросы по тегам:

Похожие вопросы: