从 项目 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", 报的错。
谢谢大家的回答,问题我已经解决了,换了一种思路,不过还是感谢大家的回答。
希望大家能指点一下,非常感谢!
1. $.post 不能实现跨域,安全原因。
2. JSONP,参考:【原创】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
看了一下您发的链接,自己尝试写了一下,还是有问题.
问题一:安全
问题二:JSONP
我把代码发出来了,能帮忙看看具体是什么问题吗?
1. 能。
2. 修改web.config允许跨域,处理OPTIONS method即可。
修改web.config允许跨域,处理OPTIONS method即可。
能不能说的具体一点,没这样用过。
@晓菜鸟:
<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); } } }
@Leo C.W: httpProtocol 应该配置在哪个节点下?
JSONP或者代理``我之前的项目里不是有处理跨域问题的接口吗?
1 $.post 是可以跨域的, 比如地址是webserver就可以,ashx就不可以
2 jsonp可以实现
我把代码发出来了,能帮忙看看具体是什么问题吗?
用jquery.ajax方法,使用jsonp可以进行跨域。
$.ajax({ type : "post", url : "http://.....", dataType : "jsonp", jsonp: "jsonpCallback", success : function(data){ alert(data) ; }, error:function(){ alert('fail'); } });
这种方式你试过吗?
@晓菜鸟: 平时需要js跨域请求的都是用的jsonp,或者从服务端去请求,自己做一下中转
@晓菜鸟:
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');
}
});
@丫头小静(Cathy): 看看我写的代码错在哪里了,谢谢
@丫头小静(Cathy): 那后台代码用改吗?
@丫头小静(Cathy): 直接请求报的是
此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet。
@晓菜鸟: 后台代码:
return Json(jsonResult, JsonRequestBehavior.AllowGet);
@丫头小静(Cathy): 嗯,我设置之后得到的是我想要的,可是我还是不知道怎么改?我改成Jsonp也报错,麻烦帮忙看看,谢谢!
@丫头小静(Cathy): 这个我已经简化了,
searchResultService.AddSearchResult(searchResult);//这里怎么又给传过来的参数直接赋值了呢
这个不是赋值,是把前端提交的表单信息保存下来,
我断点调试都没问题,正确返回,但是前端没有任何反应,打开控制台看到的就是500.
@晓菜鸟: 我刚刚好像看错了。忽略我上一条回复。
jsonp默认的是get,你写成post也不管用。
所以这种情况下,我建议自己做个中转。也就是自己写个action,在服务端去调用跨域的那个地址。然后js请求自己的这个action就不是跨域了,直接用$.post就可以了。
如果跨域get的话可以直接用jsonp调用,如果是post的话不行。
@丫头小静(Cathy): 我更改成get方式,把后台所需要的参数也都删除了,但是还是报错了,错误信息:
Unexpected token