zoukankan      html  css  js  c++  java
  • 巧妙利用JQuery和Servlet来实现跨域请求

    在网上看到很多的JQuery跨域请求的文章,比较有意思。这里我发表一个Servlet与JQuery配置实现跨域的代码,供大家参考。不足之处请指教

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

    JS代码:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //GET方式
    function reqeustCrossDomainProxyGet(){
        var url = "http://www.baidu.com";//远程请求地址
        var param = {'requesturl':url,'typedata':'JSON'};
        var data = getCrossDomainProxyRemote(param,"json");
    }
    //Post方式
    function reqeustCrossDomainProxyPost(param1,param2){
        var url = apiServer+"/api/lucene/query";
        var param = {'requesturl':url,'typedata':'JSON','param1':param1,'param2':param2};
        var data = getCrossDomainProxyRemote(param,"json");
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /**
     * JS向本址的一个Servlet发送POST请求,所有关于远程请求的参数。
     * 在此处参POST方式发送给Servlet
     * @param param 远程请求参数
     * @param rtype JS返回类型(暂时没有用到)
     * @return
     */
    function getCrossDomainProxyRemote(param,rtype){
        var url = "/cross/proxy";//Servlet的URL地址
        var returndata;
        $.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;}
        });
        return returndata;
    }

    Java代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    public class CorssDomainProxy extends HttpServlet {
         
        public void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            this.doPost(req, resp);    
        }
         
        public void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            boolean requestType = false;//标记远程请求类型,默认为GET方式
            PrintWriter out = resp.getWriter();
            Enumeration keys = req.getParameterNames();//取出客户端传入的所有参数名
            ArrayList<String> params = new ArrayList<String>();
            String url=null;
            while (keys.hasMoreElements()){
                String key = (String) keys.nextElement();
                /**
                 * 如果请求参数内有如下几种表示,这此参数不参与远程请求
                 */
                if(key.equals("requesturl")){//判断参数是否是,远程请求地址
                    url = req.getParameter(key);
                }else if(key.equals("typedata")){//判断请求数据类型,暂时没有用到
                     
                }else if(key.equals("returntype")){//判断请求返回类型,暂时没有用到
                     
                }else{
                    params.add(key);//其它加入参数列表,此处为参与远程请求的参数
                    requestType = true;//修改标记,表求远程请求为POST方式
                }
            }
             
            HttpClient client = new HttpClient();
            HttpMethod method = null;
            if(requestType){//判断请求方式,并实例化HttpMethod对象,true:POST,false:GET
                method = new UTF8PostMethod(url);
                for(String name : params){//迭代POST参数,加入到请求中
                    String _value = req.getParameter(name);
                    ((PostMethod)method).setParameter(name,_value);
                }
            }else{
                method = new GetMethod(url);
            }      
            client.executeMethod(method);//执行请求
            String bodystr = method.getResponseBodyAsString();//返回结果
            out.println(bodystr);//将结果返回给客户端
        }
         
        /**
         * 内部类,转换URL字符串为UTF-8
         * @author Administrator
         *
         */
        private static class UTF8PostMethod extends PostMethod {
            public UTF8PostMethod(String url) {
                super(url);
            }
            @Override
            public String getRequestCharSet() {
                return "UTF-8";
            }
        }
         
    }
  • 相关阅读:
    Spring框架学习09——基于AspectJ的AOP开发
    Spring框架学习08——自动代理方式实现AOP
    Spring框架学习07——基于传统代理类的AOP实现
    Spring框架学习06——AOP底层实现原理
    Spring框架学习05——AOP相关术语详解
    SpringMVC框架09——@ResponseBody的用法详解
    Spring框架学习04——复杂类型的属性注入
    Spring框架学习03——Spring Bean 的详解
    Spring框架学习01——使用IDEA开发Spring程序
    sqlserver 迁移
  • 原文地址:https://www.cnblogs.com/ranran/p/3542268.html
Copyright © 2011-2022 走看看