`
蔡华江
  • 浏览: 107625 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Servlet作为代理实现跨域访问

    博客分类:
  • JAVA
阅读更多

      内容很简单,就是在前台中调用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);
	}
}
分享到:
评论
5 楼 grandboy 2010-01-21  
想用get的参数把要传到另一个域的内容带过去,然后再处理吗? 没有理解错的话,简单来讲就是这个想法吧?
4 楼 Ihavegotyou 2010-01-21  
差timeout处理部分。
3 楼 zhaoxin31072034 2010-01-21  
楼主啊,请问你调用过BIEE的web service吗,我正在搞这玩意!
对于刚才的servletName,我已经搞明白什么意思了,呵呵!
2 楼 蔡华江 2010-01-21  
这里为了使用一个proxy可以访问多个servlet,所以将servlet名称作为参数传进后台。解析出来,使之能够调用不同的servlet。
1 楼 zhaoxin31072034 2010-01-21  
请问, 取出的"servlet名称"是哪个servlet的名称!

相关推荐

    用代理避免ajax跨域请求(手机验证码)

    在实际应用中,可以使用Node.js的Express框架结合http-proxy-middleware库创建一个简单的代理服务器,或者在Java后端使用Spring的Servlet Filter实现代理功能。此外,还可以考虑使用Nginx等反向代理服务器作为更强大...

    xmlhttp跨域解决方案

    **三、Java代理实现** 在Java环境中,我们可以使用Servlet或Spring MVC等框架实现代理服务器。以下是一个简单的Spring MVC示例: 1. 配置Spring MVC: 在`web.xml`中配置DispatcherServlet,以及在Spring配置文件...

    Ajax跨域详解与代码

    Nginx作为反向代理服务器,可以在其配置文件中添加以下规则来实现跨域: ```nginx location /api/ { proxy_pass http://target_server:8080/api/; add_header Access-Control-Allow-Origin *; add_header Access...

    servlet+vue前端代码

    综上所述,这个项目是一个使用Vue.js作为前端框架,Servlet作为后端服务的Web应用。它利用了现代前端开发的最佳实践,包括模块化、代码质量检查、单元测试和自动化构建。同时,它通过配置代理解决了前后端分离开发时...

    通过代理解决WFS服务跨域测试代码

    通过这种方式,我们可以在浏览器中安全地进行WFS服务的跨域访问。这种方法适用于开发和测试阶段,但实际部署时,应考虑使用更安全、可扩展的解决方案,如CORS(跨源资源共享)或在WFS服务端设置允许跨域的策略。

    解决javaweb端跨域问题的jar包和文档

    总之,解决Java Web端的跨域问题通常涉及到理解同源策略、CORS机制,以及如何在特定的开发框架中配置和实现跨域支持。提供的jar包和文档是解决这个问题的有效工具,通过它们可以简化这个过程并确保跨域请求的成功。

    servlet学习笔记

    作为Apache-Jakarta项目的一部分,Tomcat不仅能够执行Servlet和JSP,还具备商用Java Web应用程序服务器的特性。Tomcat是一个开源软件,采用Java编写,具有以下特点: - **开源性**:Tomcat源代码完全公开,开发者...

    storemate-backend-leveldb-0.9.23.zip

    这种技术在分布式系统、微服务架构以及需要隐藏后端真实地址或实现跨域访问控制的场景下非常有用。 【标签】"开源项目" 指出这两个文件都是开放源代码的项目,意味着它们的源代码可供公众查看、使用、修改和分发,...

    javascript实现跨域的方法汇总

    JavaScript中的跨域问题源于浏览器的同源策略,这是一种安全...以上就是JavaScript实现跨域的一些常见方法,每种方法都有其适用场景和局限性。在实际开发中,需要根据项目需求和目标服务器的特性来选择最合适的方式。

    毕业设计基于JavaWeb的前后端分离的视频网站源码+数据库,静态资源由node代理

    通过使用Node.js作为代理服务器,可以优化静态资源的加载速度,实现跨域访问控制,并且能减轻后端服务器的压力。 【标签】中涉及的“毕业设计”通常是指学生在毕业前完成的一个综合性的项目,旨在展示他们在学习...

    关于跨域以及SpringBoot的解决方案.docx

    在SpringBoot项目中,可以通过配置类来实现跨域支持。以下是一个具体的例子: ```java package cn.lpe234; import org.springframework.context.annotation.Configuration; import org.springframework.web....

    spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制.docx

    Spring Boot 1.5.4集成Shiro+CAS实现单点登录和权限控制是一个常见的企业级应用需求,它能够提供用户认证和授权的功能,并通过CAS(Central Authentication Service)实现跨域单点登录。以下是实现这一功能的具体...

    DWR3 对象传输与配置 源代码

    3. 安全性:DWR提供了多种安全策略,如跨域会话安全、白名单配置等,以防止非法访问。 4. 自动更新:DWR支持自动检测并更新客户端的JavaScript文件,以保持与服务器端的一致性。 总的来说,这个DWR3示例是一个宝贵...

    nginx_tomcat_redis搭建负载均衡共享session

    本主题将详细探讨如何使用Nginx作为反向代理和负载均衡器,Tomcat作为应用服务器,以及Redis作为会话共享存储来实现这一目标。下面我们将逐一深入这些技术及其在实际中的应用。 首先,Nginx是一款轻量级的HTTP...

    单点登录分析报告.pdf

    6. 使用反向代理模块可实现多层SSO认证,每层可配置不同验证模式。 7. 支持多种存储用户信息的方式,如数据库、LDAP和XML。 8. 提供PHP和ASP的API接口。 9. 兼容JBoss 3.2.6和Jakarta Tomcat 5.0.27以上版本。 然而...

    Spring Boot整合Web开发

    本篇文档重点介绍Spring Boot如何整合Web开发,这包括启动系统任务、整合Servlet、Filter和Listener、路径映射、配置AOP(面向切面编程)、自定义欢迎页和favicon、返回JSON数据、静态资源访问、文件上传、使用@...

    mapproxy-Tomcat下proxy.cgi设置实例

    本文将详细解析如何在Tomcat环境下配置`proxy.cgi`作为代理。 首先,`proxy.cgi`是一种通用的HTTP代理脚本,通常用Perl或Python编写,用于处理跨域请求。在OpenLayers中,当需要通过JavaScript访问不同源的地图服务...

    DWR入门教程之提示性文字

    DWR提供了多种安全特性,如跨域访问控制、JavaScript白名单机制以及请求签名,以防止未经授权的访问。在实际应用中,应根据项目需求合理设置这些安全策略。 **5. "dwrtest.war"文件解析** 在提供的文件列表中,我们...

    bbs论坛系统

    - **负载均衡**:通过Nginx等反向代理服务器,实现多台服务器间的负载均衡,提高系统可用性。 8. **前端开发** - **HTML/CSS/JavaScript**:构成用户界面,利用AJAX实现页面的异步更新,提升用户体验。 - **...

Global site tag (gtag.js) - Google Analytics