内容很简单,就是在前台中调用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);
}
}
分享到:
相关推荐
在实际应用中,可以使用Node.js的Express框架结合http-proxy-middleware库创建一个简单的代理服务器,或者在Java后端使用Spring的Servlet Filter实现代理功能。此外,还可以考虑使用Nginx等反向代理服务器作为更强大...
**三、Java代理实现** 在Java环境中,我们可以使用Servlet或Spring MVC等框架实现代理服务器。以下是一个简单的Spring MVC示例: 1. 配置Spring MVC: 在`web.xml`中配置DispatcherServlet,以及在Spring配置文件...
Nginx作为反向代理服务器,可以在其配置文件中添加以下规则来实现跨域: ```nginx location /api/ { proxy_pass http://target_server:8080/api/; add_header Access-Control-Allow-Origin *; add_header Access...
综上所述,这个项目是一个使用Vue.js作为前端框架,Servlet作为后端服务的Web应用。它利用了现代前端开发的最佳实践,包括模块化、代码质量检查、单元测试和自动化构建。同时,它通过配置代理解决了前后端分离开发时...
通过这种方式,我们可以在浏览器中安全地进行WFS服务的跨域访问。这种方法适用于开发和测试阶段,但实际部署时,应考虑使用更安全、可扩展的解决方案,如CORS(跨源资源共享)或在WFS服务端设置允许跨域的策略。
总之,解决Java Web端的跨域问题通常涉及到理解同源策略、CORS机制,以及如何在特定的开发框架中配置和实现跨域支持。提供的jar包和文档是解决这个问题的有效工具,通过它们可以简化这个过程并确保跨域请求的成功。
作为Apache-Jakarta项目的一部分,Tomcat不仅能够执行Servlet和JSP,还具备商用Java Web应用程序服务器的特性。Tomcat是一个开源软件,采用Java编写,具有以下特点: - **开源性**:Tomcat源代码完全公开,开发者...
这种技术在分布式系统、微服务架构以及需要隐藏后端真实地址或实现跨域访问控制的场景下非常有用。 【标签】"开源项目" 指出这两个文件都是开放源代码的项目,意味着它们的源代码可供公众查看、使用、修改和分发,...
JavaScript中的跨域问题源于浏览器的同源策略,这是一种安全...以上就是JavaScript实现跨域的一些常见方法,每种方法都有其适用场景和局限性。在实际开发中,需要根据项目需求和目标服务器的特性来选择最合适的方式。
通过使用Node.js作为代理服务器,可以优化静态资源的加载速度,实现跨域访问控制,并且能减轻后端服务器的压力。 【标签】中涉及的“毕业设计”通常是指学生在毕业前完成的一个综合性的项目,旨在展示他们在学习...
在SpringBoot项目中,可以通过配置类来实现跨域支持。以下是一个具体的例子: ```java package cn.lpe234; import org.springframework.context.annotation.Configuration; import org.springframework.web....
Spring Boot 1.5.4集成Shiro+CAS实现单点登录和权限控制是一个常见的企业级应用需求,它能够提供用户认证和授权的功能,并通过CAS(Central Authentication Service)实现跨域单点登录。以下是实现这一功能的具体...
3. 安全性:DWR提供了多种安全策略,如跨域会话安全、白名单配置等,以防止非法访问。 4. 自动更新:DWR支持自动检测并更新客户端的JavaScript文件,以保持与服务器端的一致性。 总的来说,这个DWR3示例是一个宝贵...
本主题将详细探讨如何使用Nginx作为反向代理和负载均衡器,Tomcat作为应用服务器,以及Redis作为会话共享存储来实现这一目标。下面我们将逐一深入这些技术及其在实际中的应用。 首先,Nginx是一款轻量级的HTTP...
6. 使用反向代理模块可实现多层SSO认证,每层可配置不同验证模式。 7. 支持多种存储用户信息的方式,如数据库、LDAP和XML。 8. 提供PHP和ASP的API接口。 9. 兼容JBoss 3.2.6和Jakarta Tomcat 5.0.27以上版本。 然而...
本篇文档重点介绍Spring Boot如何整合Web开发,这包括启动系统任务、整合Servlet、Filter和Listener、路径映射、配置AOP(面向切面编程)、自定义欢迎页和favicon、返回JSON数据、静态资源访问、文件上传、使用@...
本文将详细解析如何在Tomcat环境下配置`proxy.cgi`作为代理。 首先,`proxy.cgi`是一种通用的HTTP代理脚本,通常用Perl或Python编写,用于处理跨域请求。在OpenLayers中,当需要通过JavaScript访问不同源的地图服务...
DWR提供了多种安全特性,如跨域访问控制、JavaScript白名单机制以及请求签名,以防止未经授权的访问。在实际应用中,应根据项目需求合理设置这些安全策略。 **5. "dwrtest.war"文件解析** 在提供的文件列表中,我们...
- **负载均衡**:通过Nginx等反向代理服务器,实现多台服务器间的负载均衡,提高系统可用性。 8. **前端开发** - **HTML/CSS/JavaScript**:构成用户界面,利用AJAX实现页面的异步更新,提升用户体验。 - **...