首页 新闻 会员 周边

$.post 提交表单 不能跨域,应该怎么做?麻烦大家帮忙看看,很急,在线等,谢谢!

0
悬赏园豆:20 [已解决问题] 解决于 2014-08-02 16:56

从 项目 A 里面填写一个 表单,通过 $.post 提交表单到项目 C ,不能跨域,总是返回 500 ,因为表单的内容较多,所以我用的是 post 的 ,表单提交到项目 C 下面的一个 控制器(C# MVC)里面做处理,可是找了很多答案,貌似  $.post 不能实现跨域 。

问题一:$.post 能不能实现跨域 ? 为什么?

问题二:要实现跨域的话换什么方式比较好?

问题补充:

我把简化后的代码发出来,大家帮忙看看,谢谢了。

项目A的前端代码:

function AddSS() {
    $.ajax('http://localhost:11515/Search/SearchResult',
    {
        type: 'POST',
        dataType: 'json',
        async: false,
        global: false,
        cache: false,
        data: $("#ssForm").serialize(),
        success: function(result) {
            alert("OK");
        },
        error: function() {
            alert("fail");
        }
    });
}

 

项目C的后端代码:

public JsonResult SearchResult(SearchResult searchResult)
{
    searchResultService.AddSearchResult(searchResult);
    JsonResultModel jsonResult=new JsonResultModel();
    jsonResult.Result = true;
    jsonResult.Message = "调用完成";
    return Json(jsonResult);
}  

 

第一幅图是 Json 格式下 报的错,第二幅图是我改成了 

dataType: "jsonp",
jsonp: "jsonpCallback",   报的错。

 

 

                          

 

谢谢大家的回答,问题我已经解决了,换了一种思路,不过还是感谢大家的回答。                  

晓菜鸟的主页 晓菜鸟 | 老鸟四级 | 园豆:2594
提问于:2014-07-29 17:37
< >
分享
最佳答案
0

希望大家能指点一下,非常感谢!

晓菜鸟 | 老鸟四级 |园豆:2594 | 2014-07-29 17:38
其他回答(6)
0

1. $.post 不能实现跨域,安全原因。

2. JSONP,参考:【原创】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

收获园豆:5
dudu | 园豆:30994 (高人七级) | 2014-07-29 17:46

 看了一下您发的链接,自己尝试写了一下,还是有问题.

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 14:47
0

问题一:安全

问题二:JSONP

收获园豆:2
Launcher | 园豆:45045 (高人七级) | 2014-07-29 17:46

我把代码发出来了,能帮忙看看具体是什么问题吗?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 15:19
0

1. 能。

2. 修改web.config允许跨域,处理OPTIONS method即可。

收获园豆:3
Leo C.W | 园豆:155 (初学一级) | 2014-07-29 17:54

修改web.config允许跨域,处理OPTIONS method即可。

能不能说的具体一点,没这样用过。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 15:20

@晓菜鸟: 

<httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*"/>
        <add name="Access-Control-Allow-Headers" value="Content-Type,ACCESSTOKEN,VERSION"/>
        <add name="Access-Control-Allow-Methods" value="GET,POST"/>
      </customHeaders>
    </httpProtocol>
public class AllowCrossDomainAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var method = filterContext.HttpContext.Request.HttpMethod;
            if (method.Eq("options"))
            {
                filterContext.Result = new ContentResult();
            }
            else
            {
                base.OnActionExecuting(filterContext);
            }
        }
    }
支持(0) 反对(0) Leo C.W | 园豆:155 (初学一级) | 2014-07-30 15:31

@Leo C.W: httpProtocol 应该配置在哪个节点下?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 15:39
0

JSONP或者代理``我之前的项目里不是有处理跨域问题的接口吗?

收获园豆:2
吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-29 18:28
0

1 $.post 是可以跨域的, 比如地址是webserver就可以,ashx就不可以

2 jsonp可以实现

收获园豆:3
刘宏玺 | 园豆:14020 (专家六级) | 2014-07-29 21:30

我把代码发出来了,能帮忙看看具体是什么问题吗?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 15:19
0

用jquery.ajax方法,使用jsonp可以进行跨域。

$.ajax({  
        type : "post",   
        url : "http://.....",  
        dataType : "jsonp",
        jsonp: "jsonpCallback",
        success : function(data){  
          alert(data) ;
        },  
        error:function(){  
            alert('fail');  
        }  
    });   

 

收获园豆:5
敬YES | 园豆:490 (菜鸟二级) | 2014-07-30 09:28

这种方式你试过吗?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 13:36

@晓菜鸟: 平时需要js跨域请求的都是用的jsonp,或者从服务端去请求,自己做一下中转

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2014-07-30 13:37

@晓菜鸟: 

dataType: 'json',这个明显不是jsonp啊

$.ajax({
type : "post",
url : "http://localhost:11515/Search/SearchResult",
dataType : "jsonp",
jsonp: "jsonpCallback",
success : function(data){
alert(data) ;
},
error:function(){
alert('fail');
}
});

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2014-07-30 14:48

@丫头小静(Cathy): 看看我写的代码错在哪里了,谢谢

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 14:48

@丫头小静(Cathy): 那后台代码用改吗?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 14:49

@丫头小静(Cathy): 直接请求报的是 

此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 14:57

@晓菜鸟: 后台代码:

return Json(jsonResult, JsonRequestBehavior.AllowGet);
支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2014-07-30 14:59

@丫头小静(Cathy): 嗯,我设置之后得到的是我想要的,可是我还是不知道怎么改?我改成Jsonp也报错,麻烦帮忙看看,谢谢!

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 15:05

@丫头小静(Cathy): 这个我已经简化了,

searchResultService.AddSearchResult(searchResult);//这里怎么又给传过来的参数直接赋值了呢

这个不是赋值,是把前端提交的表单信息保存下来,

我断点调试都没问题,正确返回,但是前端没有任何反应,打开控制台看到的就是500.

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 15:15

@晓菜鸟: 我刚刚好像看错了。忽略我上一条回复。

jsonp默认的是get,你写成post也不管用。

所以这种情况下,我建议自己做个中转。也就是自己写个action,在服务端去调用跨域的那个地址。然后js请求自己的这个action就不是跨域了,直接用$.post就可以了。

 

如果跨域get的话可以直接用jsonp调用,如果是post的话不行。

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2014-07-30 15:20

@丫头小静(Cathy): 我更改成get方式,把后台所需要的参数也都删除了,但是还是报错了,错误信息:

Unexpected token 

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-07-30 15:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册