Servlet作為代理實現跨域訪問
阿新 • • 發佈:2019-01-22
就是在前臺中呼叫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);
}
}