zl程序教程

您现在的位置是:首页 >  前端

当前栏目

利用JQuery和Servlet实现跨域提交请求示例分享

jQueryServlet跨域 实现 利用 示例 分享 请求
2023-06-13 09:15:17 时间

原理:JavaScript的Ajax不可以跨域,但是可以通过向本地的一个Servlet发出请求,由Servlet完成跨域。再把远程的结构返回给客户端。这样Ajax就可以跨域了。在后面,再发一个PHP版本的,请大家关注啊。下面是代码

JS代码:

注意:在Post方式时,param1和param2为向远程发送的参数值,可以有多个。

复制代码代码如下:


//GET方式
functionreqeustCrossDomainProxyGet(){
   varurl="http://www.baidu.com";//远程请求地址
   varparam={"requesturl":url,"typedata":"JSON"};
   vardata=getCrossDomainProxyRemote(param,"json");
}
//Post方式
functionreqeustCrossDomainProxyPost(param1,param2){
   varurl=apiServer+"/api/lucene/query";
   varparam={"requesturl":url,"typedata":"JSON","param1":param1,"param2":param2};
   vardata=getCrossDomainProxyRemote(param,"json");
}

/**
 *JS向本址的一个Servlet发送POST请求,所有关于远程请求的参数。
 *在此处参POST方式发送给Servlet
 *@paramparam远程请求参数
 *@paramrtypeJS返回类型(暂时没有用到)
 *@return
 */
functiongetCrossDomainProxyRemote(param,rtype){
   varurl="/cross/proxy";//Servlet的URL地址
   varreturndata;
   $.ajax({
       url:url,type:"POST",dataType:rtype,timeout:40000,data:param,async:false,
       error:function(response,error){alert(response.status);},
       success:function(data){returndata=data;}
   });
   returnreturndata;
}

Java代码:

复制代码代码如下:


publicclassCorssDomainProxyextendsHttpServlet{

   publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
           throwsServletException,IOException{
       this.doPost(req,resp);    
   }

   publicvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
           throwsServletException,IOException{
       booleanrequestType=false;//标记远程请求类型,默认为GET方式
       PrintWriterout=resp.getWriter();
       Enumerationkeys=req.getParameterNames();//取出客户端传入的所有参数名
       ArrayList<String>params=newArrayList<String>();
       Stringurl=null;
       while(keys.hasMoreElements()){
           Stringkey=(String)keys.nextElement();
           /**
            *如果请求参数内有如下几种表示,这此参数不参与远程请求
            */
           if(key.equals("requesturl")){//判断参数是否是,远程请求地址
               url=req.getParameter(key);
           }elseif(key.equals("typedata")){//判断请求数据类型,暂时没有用到

           }elseif(key.equals("returntype")){//判断请求返回类型,暂时没有用到

           }else{
               params.add(key);//其它加入参数列表,此处为参与远程请求的参数
               requestType=true;//修改标记,表求远程请求为POST方式
           }
       }

       HttpClientclient=newHttpClient();
       HttpMethodmethod=null;
       if(requestType){//判断请求方式,并实例化HttpMethod对象,true:POST,false:GET
           method=newUTF8PostMethod(url);
           for(Stringname:params){//迭代POST参数,加入到请求中
               String_value=req.getParameter(name);
               ((PostMethod)method).setParameter(name,_value);
           }
       }else{
           method=newGetMethod(url);
       }      
       client.executeMethod(method);//执行请求
       Stringbodystr=method.getResponseBodyAsString();//返回结果
       out.println(bodystr);//将结果返回给客户端
   }

   /**
    *内部类,转换URL字符串为UTF-8
    *@authorAdministrator
    *
    */
   privatestaticclassUTF8PostMethodextendsPostMethod{
       publicUTF8PostMethod(Stringurl){
           super(url);
       }
       @Override
       publicStringgetRequestCharSet(){
           return"UTF-8";
       }
   }

}