使用服务端HTTP Client实现前jquery post跨域请求

来源:互联网 发布:vscode rails 编辑:程序博客网 时间:2024/06/05 23:51

在网上查了很久,由于浏览器和协议的限制(更多的是安全的考虑),jquery无法实现跨域的post请求,今天要给大家介绍的方案是通过在同域的服务器端创建一个Controller,将post要请求的外域的url及其参数传到同域的Controller,服务器端使用HTTP Client再去请求接受到的url及其参数,并将返回的getResponseBodyAsString结果返回给post的result。

虽然网上也有人说通过jquery jsonp的形式去请求,但是我请求的url返回内容如果不是json对象,那还是达不到解决问题的目的,第一篇处女博客,废话不多说,上代码!

前段的js代码如下:

this._loadportletContent = function(co,uri){if(uri){if(uri == "default"){$(co).html("该Portlet定义文件存在问题,请联系系统管理员,给您带来的不便深表歉意!");}else{$.post("portlet/getportlet",{url : uri,},function(result){$(co).html(result);}).error(function(){$(co).html("Portlet加载失败,请重新登录后再试,给您带来的不便深表歉意!");});}}else{$(co).html("该Portlet定义文件存在问题,请联系系统管理员,给您带来的不便深表歉意!");}};

代码解释:

1.参数co是一个div对象,请求的外域url返回结果(html页面,text,json等,anyway)将会写入这个div

2.uri,我将要通过post请求的外域url

3.$.post后的第一个url参数portlet/getportlet,是要请求的同域Controller的相对地址,它接受一个参数url实际就是2中的外域uri

=========================================================

后端Controller是用java写的,代码如下:

package com.joywintech.portal.portal.controller;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpException;import org.apache.commons.httpclient.methods.PostMethod;import org.apache.http.protocol.HTTP;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import com.joywintech.common.util.ResponseUtils;@Controller@RequestMapping("/portlet")public class PortletController {private ResponseUtils responseutil;@RequestMapping("getportlet")public void getPortlet(HttpServletRequest request,HttpServletResponse response) throws HttpException, IOException{String url = request.getParameter("url");PostMethod pe = new PostMethod(url){    @Override    public boolean getFollowRedirects()    {        return true;    }};pe.setRequestHeader("Connection", "close");HttpClient client = new HttpClient();client.getParams().setParameter(HTTP.CONTENT_ENCODING, "UTF-8"); int code = client.executeMethod(pe);if(code != 200)        {            responseutil.renderJson(response, "{\"message\":\"200\"}");        }String respbody = pe.getResponseBodyAsString();InputStream in = pe.getResponseBodyAsStream();                ByteArrayOutputStream outStream = new ByteArrayOutputStream();          byte[] data = new byte[32768];          int count = -1;          while((count = in.read(data,0,32768)) != -1)              outStream.write(data, 0, count);                    data = null;          String respStr = new String(outStream.toByteArray(),"GB2312");  responseutil.renderHtml(response, respStr);}}



0 0
原创粉丝点击