六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 45|回复: 0

Servlet作为代理实现跨域访问

[复制链接]

升级  2%

13

主题

13

主题

13

主题

秀才

Rank: 2

积分
53
 楼主| 发表于 2013-1-15 02:47:30 | 显示全部楼层 |阅读模式
      内容很简单,就是在前台中调用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;}@Overridepublic void init() throws ServletException {// 设置目标服务器地址url = this.getInitParameter("url");if (!url.endsWith("/"))url = url + "/";}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String[] target = parse(req.getParameterMap());process(req, resp, target);}}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表