在web應用之間轉發請求

web應用之間轉發請求

  1. 步驟
    • 由於每個web應用都配備了一個大管家—-ServletContext,我們可以獲得這個web應用的管家來轉發請求到這個web應用的某個ServletJSPHTML文檔。
    • 由於從一個web應用訪問另一個web應用資源存在安全問題,所以默認是不能訪問的。我們可以在web應用的目錄META-INF下創建一個context.xml文件,指定crossContext的值爲true,即可訪問。它的值默認是false。
    • 具體到代碼,要獲得一個web應用的ServletContext,可以使用ServletContext對象的getContext(String uripath)方法,uripath指定其他web應用的URL入口。
  2. 代碼

    • 使用eclipse新建兩個Dynamin Web Project項目,名稱是TestServletDispatcher,分別新建兩個類CrossServletOutputServlet,都繼承HttpServlet前者將用戶請求轉發到Dispatcher應用下的outputServlet。類代碼如下:

      CrossServlet類:

      package com.lovo.visitother;
      
      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;
      
      public class CrossServlet extends HttpServlet {
          private static final long serialVersionUID = 1L;
      
          public CrossServlet() {
              super();
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              String name = request.getParameter("username");
              response.setContentType("text/plain;charset=utf-8");
              if (name == null) {
                  name = "Please Input Username!";
              } else {
                  name = "Hello! " + name;
              }
              PrintWriter out = response.getWriter();
              request.setAttribute("username", name);
              ServletContext context = this.getServletContext();
              //獲取web應用Dispatcher的ServletContext
              ServletContext crossContext = context.getContext("/Dispatcher");
              //獲取請求轉發的對象
              RequestDispatcher patcher = crossContext.getRequestDispatcher("/OutputServlet");
              patcher.forward(request, response);
          }
      
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              doGet(request, response);
          }
      }
      

      OutputServlet類:

    package com.lovo.dispatcher;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class OutputServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        public OutputServlet() {
            super();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            String msg = (String) request.getAttribute("username");
            PrintWriter out = response.getWriter();
            out.println(msg);
            out.write("===================");
            out.close();
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    
    • 兩個Servletweb.xml文件

    CrossServlet類的web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
        <display-name>TestServlet</display-name>
        <servlet>
            <servlet-name>CrossServlet</servlet-name>
            <servlet-class>com.lovo.visitother.CrossServlet</servlet-class>
        </servlet>
        <servlet-mapping>
                <servlet-name>CrossServlet</servlet-name>
                <url-pattern>/TestServlet/CrossServlet</url-pattern>
        </servlet-mapping>
    </web-app>

    OutputServlet類的web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
        <display-name>Dispatcher</display-name>
        <servlet>
            <servlet-name>OutputServlet</servlet-name>
            <servlet-class>com.lovo.dispatcher.OutputServlet</servlet-class>
        </servlet>
        <servlet-mapping>
                <servlet-name>OutputServlet</servlet-name>
                <url-pattern>/Dispatcher/OutputServlet</url-pattern>
        </servlet-mapping>
    </web-app>
    • 配置CrossServletcontext.xml文件

      • web應用TestServletwebContent下的META_INF目錄創建context.xml文件,文件內容如下:
      <?xml version="1.0" encoding="UTF-8"?>
      <context reloadable="true" crossContext="true"></context>
    • reloadable="true"的意思是讓Tomcat監測文件是否改動,如果有改動,自動重新加載。

    • crossContext="true"表示可以訪問另一個web資源
    • 所有弄好之後,項目的文件如下圖所示:
      這裏寫圖片描述
  3. 運行
    • eclipse運行Tomcat在瀏覽器輸入localhost:8080/TestServlet/CrossServlet,即可訪.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章