1. 程式人生 > >Servlet作為代理實現跨域訪問

Servlet作為代理實現跨域訪問

就是在前臺中呼叫proxy程式的servlet,設定引數servletName和其它引數。代理程式會將該請求傳送到目的地址的名稱為servletName的servlet中去,並將其它引數作為請求的引數,在得到結果後,將內容原樣輸出到請求頁面。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import
java.net.URL; import java.net.URLEncoder; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class
ProxyServlet extends HttpServlet {
private String url; /** * 對servlet進行請求處理,並將結果在指定輸出流中輸出 * * @param os * @param servletName * @param parm * @throws IOException * @throws MalformedURLException */ private void process(HttpServletRequest req, HttpServletResponse resp, String[] target) throws
MalformedURLException, IOException { // 取得連線 HttpURLConnection huc = (HttpURLConnection) new URL(url + target[0]) .openConnection(); // 設定連線屬性 huc.setDoOutput(true); huc.setRequestMethod("POST"); huc.setUseCaches(false); huc.setInstanceFollowRedirects(true); huc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); huc.connect(); // 往目標servlet中提供引數 OutputStream targetOS = huc.getOutputStream(); targetOS.write(target[1].getBytes()); targetOS.flush(); targetOS.close(); // 取得頁面輸出,並設定頁面編碼及快取設定 resp.setContentType(huc.getContentType()); resp.setHeader("Cache-Control", huc.getHeaderField("Cache-Control")); resp.setHeader("Pragma", huc.getHeaderField("Pragma")); resp.setHeader("Expires", huc.getHeaderField("Expires")); OutputStream os = resp.getOutputStream(); // 將目標servlet的輸入流直接往頁面輸出 InputStream targetIS = huc.getInputStream(); int r; while ((r = targetIS.read()) != -1) { os.write(r); } targetIS.close(); os.flush(); os.close(); huc.disconnect(); } /** * 將引數中的目標分離成由目標servlet名稱和引數組成的陣列 * * @param queryString * @return * @throws UnsupportedEncodingException */ private String[] parse(Map map) throws UnsupportedEncodingException { String[] arr = { "", "" }; Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry me = (Entry) iter.next(); String[] varr = (String[]) me.getValue(); if ("servletName".equals(me.getKey())) { // 取出servlet名稱 arr[0] = varr[0]; } else { // 重新組裝引數字串 for (int i = 0; i < varr.length; i++) { // 引數需要進行轉碼,實現字符集的統一 arr[1] += "&" + me.getKey() + "=" + URLEncoder.encode(varr[i], "utf-8"); } } } arr[1] = arr[1].replaceAll("^&", ""); return arr; } @Override public void init() throws ServletException { // 設定目標伺服器地址 url = this.getInitParameter("url"); if (!url.endsWith("/")) url = url + "/"; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String[] target = parse(req.getParameterMap()); process(req, resp, target); } }