首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Servlet 實現 Ajax 代理:跨域請求轉發實戰

     編輯:Java 程式設計入門

在前後端分離架構下,瀏覽器同源策略常導致跨域問題。一種經典解法是編寫一個 Servlet 代理,將前端請求轉發至目標伺服器,再將響應原路返回。本文提供一個簡潔可用的 ProxyServlet 實現。

核心原理

  1. Servlet 初始化時讀取配置參數 REDIRECT_BASE(目標基礎 URL)。
  2. 接收客戶端 GET 請求,保留原查詢字串。
  3. 建立目標 URL 連線,將輸入流直接複製到輸出流完成透傳。

完整程式碼

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProxyServlet extends HttpServlet {
    private static final String COPYRIGHT = com.ibm.dogear.Copyright.SHORT;
    public static final String REDIRECT_BASE = "com.ibm.bl.servlet.RedirectServlet.redirect_base";
    private String redirectBase;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        redirectBase = getRequiredParam(REDIRECT_BASE);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String queryString = req.getQueryString();
        URL url = new URL(redirectBase + (queryString != null ? "?" + queryString : ""));
        copyInputStreamToOutputStream(url.openStream(), resp.getOutputStream());
    }

    private void copyInputStreamToOutputStream(InputStream in, ServletOutputStream out) throws IOException {
        try {
            try {
                byte[] buffer = new byte[1024];
                int n;
                while ((n = in.read(buffer)) != -1) {
                    out.write(buffer, 0, n);
                }
            } finally {
                out.close();
            }
        } finally {
            in.close();
        }
    }

    protected String getRequiredParam(String param) throws ServletException {
        String result = getServletConfig().getInitParameter(param);
        if (result == null) {
            throw new ServletException(getClass() + " requires " + param + " param");
        }
        return result;
    }
}

部署與配置

在 web.xml 中註冊 Servlet 並指定初始化參數:

<servlet>
    <servlet-name>ProxyServlet</servlet-name>
    <servlet-class>com.example.ProxyServlet</servlet-class>
    <init-param>
        <param-name>com.ibm.bl.servlet.RedirectServlet.redirect_base</param-name>
        <param-value>https://target-server.com/api</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>ProxyServlet</servlet-name>
    <url-pattern>/proxy/*</url-pattern>
</servlet-mapping>

注意事項與擴展

  • 僅支援 GET,生產環境需補全 POST、Header 轉發、HTTPS 憑證處理。
  • 未處理 Cookie、認證頭等敏感資訊,實際使用需按安全策略過濾或轉發。
  • 大流量場景建議使用成熟網關(Nginx、Spring Cloud Gateway)替代自建 Servlet。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved