GVKun编程网logo

AJAX POST&跨域 解决方案 - CORS(ajax跨域请求解决方案)

11

在本文中,我们将为您详细介绍AJAXPOST&跨域解决方案-CORS的相关知识,并且为您解答关于ajax跨域请求解决方案的疑问,此外,我们还会提供一些关于ajaxget和post取session解决方

在本文中,我们将为您详细介绍AJAX POST&跨域 解决方案 - CORS的相关知识,并且为您解答关于ajax跨域请求解决方案的疑问,此外,我们还会提供一些关于ajax get 和 post 取 session 解决方案、AJAX POST & 跨域 解决方案 - CORS、AJAX POST&跨域 解决方案、Ajax Post请求中文乱码问题解决方案的有用信息。

本文目录一览:

AJAX POST&跨域 解决方案 - CORS(ajax跨域请求解决方案)

AJAX POST&跨域 解决方案 - CORS(ajax跨域请求解决方案)

 一晃又到新年了,于是开始着手好好整理下自己的文档,顺便把一些自认为有意义的放在博客上,记录成点的点滴。
  跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域操作,所以跨域能力也算是前端工程师的基本功之一。
  和大多数跨域的解决方案一样,JSONP也是我的选择,可是某天PM的需求变了,某功能需要改成支持POST,因为传输的数据量比较大,GET形式搞不定。所以折腾了下闻名已久的 CORS(跨域资源共享,Cross-Origin Resource Sharing ,这边文章也就是折腾期间的小记与总结。

概述

  • CORS能做什么:
正常使用AJAX会需要正常考虑跨域问题,所以伟大的程序员们又折腾出了一系列跨域问题的解决方案,如JSONP、flash、ifame、xhr2等等。
本文介绍的CORS就是一套AJAX跨域问题的解决方案。
  • CORS的原理:
CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。
  • CORS浏览器支持情况如下图:
  喜闻乐见、普大喜奔的支持情况,尤其是在 移动终端上,除了opera Mini;
  PC上的现代浏览器都能友好的支持,除了IE9-,不过前端工程师对这种情况早应该习惯了...

CORS启航

  假设我们页面或者应用已在 http://www.test1.com上了,而我们打算从 http://www.test2.com请求提取数据。一般情况下,如果我们直接使用 AJAX 来请求将会失败,浏览器也会返回“源不匹配”的错误," 跨域"也就以此由来。
  利用 CORS, http://www.test2.com只需添加一个标头,就可以允许来自 http://www.test1.com的请求,下图是我在PHP中的 hander() 设置, “*”号表示允许任何域向我们的服务端提交请求
   也可以设置指定的域名,如域名http://www.test2.com,那么就允许来自这个域名的请求
  当前我设置的header为“*”,任意一个请求过来之后服务端我们都可以进行处理&响应,那么在调试工具中可以看到其头信息设置,其中见红框中有一项信息是“ Access-Control-Allow-Origin:*”,表示我们已经启用CORS,如下图。
   PS: 由于demo都在我厂的两台测试机间完成,外网也不能访问,所以在这就不提供demo了,见谅
  简单的一个header设置,一个支持跨域&POST请求的server就完成了:)
  当然,如果没有开启CORS必定失败的啦,如下图:
  

问题&小结

  • 刚刚说到的兼容性。CORS是W3C中一项较新的方案,所以部分浏览器还没有对其进行支持或者完美支持,详情可移至http://www.w3.org/TR/cors/
  • 安全问题。CORS提供了一种跨域请求方案,但没有为安全访问提供足够的保障机制,如果你需要信息的绝对安全,不要依赖CORS当中的权限制度,应当使用更多其它的措施来保障,比如OAuth2。
  自认为的cors使用场景:
  • cors在移动终端支持的不错,可以考虑在移动端全面尝试;PC上有不兼容和没有完美支持,所以小心踩坑。当然浏览器兼容就是个伪命题,说不准某个浏览器的某个版本就完美兼容了,说不准就有点小坑,尼玛伤不起!~
  • jsonp是get形式,承载的信息量有限,所以信息量较大时CORS是不二选择;
  • 配合新的JSAPI(fileapi、xhr2等)一起使用,实现强大的新体验功能。
  如果觉得这文章也算用心,请劳驾点右下角的推荐。
  祝2014顺利。
  最后,有 北京&上海 的朋友想春节后想换工作的,【百度移动云事业部】期待聪明、勤奋的你 与我联系 (JD在页面右上角)
参考资料:
http://www.w3.org/TR/cors/
http://www.html5rocks.com/en/tutorials/cors/
http://caniuse.com/#search=cors
作者: 聂微东
出处: http://www.cnblogs.com/Darren_code/

ajax get 和 post 取 session 解决方案

ajax get 和 post 取 session 解决方案

ajax 发送时 写入以下参数

xhrFields: {
       withCredentials: true
},

$.ajax({
    url : ''....'' , 
    type : ''get'' , 
    xhrFields: {
            withCredentials: true
        },
    success : function(){
    
    } ,
})

php 端设置

header(''Access-Control-Allow-Credentials: true'');

 

如果是 angulars

.config([''$httpProvider'', function($httpProvider) {
  $httpProvider.defaults.withCredentials = true;
}]);

 

AJAX POST & 跨域 解决方案 - CORS

AJAX POST & 跨域 解决方案 - CORS

跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制 (同源策略, 即 JavaScript 或 Cookie 只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域操作,所以跨域能力也算是前端工程师的基本功之一。

  和大多数跨域的解决方案一样,JSONP 也是我的选择,可是某天 PM 的需求变了,某功能需要改成支持 POST,因为传输的数据量比较大,GET 形式搞不定。所以折腾了下闻名已久的 CORS(跨域资源共享,Cross-Origin Resource Sharing,这边文章也就是折腾期间的小记与总结。

自认为的 cors 使用场景:

  • cors 在移动终端支持的不错,可以考虑在移动端全面尝试;PC 上有不兼容和没有完美支持,所以小心踩坑。当然浏览器兼容就是个伪命题,说不准某个浏览器的某个版本就完美兼容了,说不准就有点小坑,尼玛伤不起!~

  • jsonp 是 get 形式,承载的信息量有限,所以信息量较大时 CORS 是不二选择;

  • 配合新的 JSAPI (fileapi、xhr2 等) 一起使用,实现强大的新体验功能。

AJAX POST&跨域 解决方案

AJAX POST&跨域 解决方案

 跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域操作,所以跨域能力也算是前端工程师的基本功之一。
  和大多数跨域的解决方案一样,JSONP也是我的选择,可是某天PM的需求变了,某功能需要改成支持POST,因为传输的数据量比较大,GET形式搞不定。所以折腾了下闻名已久的 CORS(跨域资源共享,Cross-Origin Resource Sharing ,这边文章也就是折腾期间的小记与总结。

概述

    @H_301_20@CORS能做什么:
正常使用AJAX会需要正常考虑跨域问题,所以伟大的程序员们又折腾出了一系列跨域问题的解决方案,如JSONP、flash、ifame、xhr2等等。
本文介绍的CORS就是一套AJAX跨域问题的解决方案。
    @H_301_20@CORS的原理:
CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。
    @H_301_20@CORS浏览器支持情况如下图:
  喜闻乐见、普大喜奔的支持情况,尤其是在 移动终端上,除了opera Mini;
  PC上的现代浏览器都能友好的支持,除了IE9-,不过前端工程师对这种情况早应该习惯了...
CORS启航
  假设我们页面或者应用已在 http://www.test1.com上了,而我们打算从 http://www.test2.com请求提取数据。一般情况下,如果我们直接使用 AJAX 来请求将会失败,浏览器也会返回“源不匹配”的错误," 跨域"也就以此由来。
  利用 CORS, http://www.test2.com只需添加一个标头,就可以允许来自 http://www.test1.com的请求,下图是我在PHP中的 hander() 设置, “*”号表示允许任何域向我们的服务端提交请求
   也可以设置指定的域名,如域名http://www.test2.com,那么就允许来自这个域名的请求
  当前我设置的header为“*”,任意一个请求过来之后服务端我们都可以进行处理&响应,那么在调试工具中可以看到其头信息设置,其中见红框中有一项信息是“ Access-Control-Allow-Origin:*”,表示我们已经启用CORS,如下图。
   PS: 由于demo都在我厂的两台测试机间完成,外网也不能访问,所以在这就不提供demo了,见谅
  简单的一个header设置,一个支持跨域&POST请求的server就完成了:)
  当然,如果没有开启CORS必定失败的啦,如下图:
  

问题&小结

    @H_301_20@刚刚说到的兼容性。CORS是W3C中一项较新的方案,所以部分浏览器还没有对其进行支持或者完美支持,详情可移至http://www.w3.org/TR/cors/ @H_301_20@安全问题。CORS提供了一种跨域请求方案,但没有为安全访问提供足够的保障机制,如果你需要信息的绝对安全,不要依赖CORS当中的权限制度,应当使用更多其它的措施来保障,比如OAuth2。
  自认为的cors使用场景:
    @H_301_20@cors在移动终端支持的不错,可以考虑在移动端全面尝试;PC上有不兼容和没有完美支持,所以小心踩坑。当然浏览器兼容就是个伪命题,说不准某个浏览器的某个版本就完美兼容了,说不准就有点小坑,尼玛伤不起!~ @H_301_20@jsonp是get形式,承载的信息量有限,所以信息量较大时CORS是不二选择; @H_301_20@配合新的JSAPI(fileapi、xhr2等)一起使用,实现强大的新体验功能。

总结

以上是小编为你收集整理的AJAX POST&跨域 解决方案全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Ajax Post请求中文乱码问题解决方案

Ajax Post请求中文乱码问题解决方案

本文介绍解决ajax post中文乱码的问题的方案,如果你的web应用中全部使用utf-8编码,那将不会有这上问题。这里主要是解决那些要求页面编码是gbk或 gb2312等非utf-8编码(有时候由于历史遗留问题,就会有这种需求)的web应用遇到的ajax post中文乱码问题。
通常,对于这个问题有三种解决方法:

  • 通过前端页面在ajax post数据时把数据使用encodeURIComponent方法编码两次,后台以utf-8编码取出,使用 java.net.URLDecoder.decode方法解码一次后即可取得正确的数据。----这种方式网上见到的最多,但这样做前端和后台的藕合太 大,而且后台加入的这个解码用的代码与业务逻辑无关,却可能要写在业务逻辑的代码里,显然不是个很好的方案。由其对于大的系统来说,必须跟前端和后台的开 发人员协调好,否则容易出现问题。
  • 第二种方案,比第一次方案前后台的藕合要小,类似于命令模式。通过一个Filter,根据请求的url中的标记用参数来判断是否要把request的编码设置为UTF-8,可以参考我的另一篇博客:http://hjg1988.iteye.com/blog/467715。----这个方案是通过前台向后台发出一条命令来告诉后台对编码进行处理,对前台的要求降低了。注意其中后台是通过request.getQueryString方法而不是getParameter方法来判断是否含有标记。
  • 第三种方案就是我要介绍的方案,与第二种相同,主要问题就是如何让后台知道这是一个ajax post请求,而不是普通的请求。之前因为不知道如何在后台知道前台发来的请求是ajax post的,所以要求前台发出一个命令。而这个方案是我在看到了http://www.iteye.com/topic/336790这个帖子后才知道还有这种方式可以知道是否是一个ajax post请求。下面是我修改过后的方案:


  • Java代码
    1. packagecom.hjg.demo.filter;
    2. importjava.io.IOException;
    3. importjavax.servlet.Filter;
    4. importjavax.servlet.FilterChain;
    5. importjavax.servlet.FilterConfig;
    6. importjavax.servlet.servletexception;
    7. importjavax.servlet.ServletRequest;
    8. importjavax.servlet.ServletResponse;
    9. importjavax.servlet.http.HttpServletRequest;
    10. /**
    11. *针对ajaxpost请求进行编码设置,因为Ajaxpost请求总是UTF-8的,<br/>
    12. *这有可能与应用程序的整体编码设置不一致(由需求决定,比如所有页面<br/>
    13. *统一使用GBK),所以如果不加处理可能会造成中文乱码。<br/>
    14. *这个Filter不对应用程序的整体编码进行过滤,即不会影响整体编码设置<br/>
    15. *(Web框架会对编码进行设置),只需要把这个Filter配置在所有Filter之前<br/>
    16. *
    17. *@authorjinggang.huangjg
    18. *
    19. */
    20. publicclassAjaxPostEncodingFilterimplementsFilter{
    21. /**ajaxpost请求的默认contenttype*/
    22. publicstaticfinalStringAJAX_POST_CONTENT_TYPE_DEFAULT="application/x-www-form-urlencoded";
    23. /**ajaxpost请求的编码,W3C标准为UTF-8*/
    24. publicstaticfinalStringAJAX_POST_ENCODE="UTF-8";
    25. privateStringajaxPostContentType;
    26. publicvoiddoFilter(ServletRequestreq,ServletResponseres,
    27. FilterChainchain)throwsIOException,servletexception{
    28. HttpServletRequestrequest=(HttpServletRequest)req;
    29. StringrequestedWith=request.getHeader("x-requested-with");
    30. StringcontentType=request.getContentType();
    31. //表明是一个Ajax的post请求,并且不是使用隐藏的iframe实现的
    32. if("XMLHttpRequest".equalsIgnoreCase(requestedWith)&&null!=contentType
    33. &&contentType.toLowerCase().startsWith(ajaxPostContentType.toLowerCase())){
    34. request.setCharacterEncoding(AJAX_POST_ENCODE);
    35. /*
    36. *调用getParameter方法可以让在此之后调用的setCharacterEncoding方法失效,
    37. *参数可以为任何值(canbeanything)
    38. *可以防止WEB框架或用户程序再次将其设置回GBK等其它编码,
    39. *因为有些情况下,用户的要求的页面编码不是UTF-8而是GBK或其它的
    40. */
    41. request.getParameter("canbeanything");
    42. }
    43. chain.doFilter(req,res);
    44. }
    45. publicvoidinit(FilterConfigfilterConfig)throwsservletexception{
    46. ajaxPostContentType=filterConfig.getinitParameter("ajaxPostContentType");
    47. if(null==ajaxPostContentType){
    48. ajaxPostContentType=AJAX_POST_CONTENT_TYPE_DEFAULT;
    49. }
    50. }
    51. publicvoiddestroy(){
    52. }
    53. }

    这是web.xml的配置:
    Xml代码
    1. <filter>
    2. <filter-name>ajax-post-encoding</filter-name>
    3. <filter-class>com.hjg.demo.filter.AjaxPostEncodingFilter</filter-class>
    4. <!--
    5. 以下配置可以省略,ajaxPostContentType默认为application/x-www-form-urlencoded,
    6. 除非你的ajaxpost请求设置了不同的contentType
    7. -->
    8. <!--
    9. <init-param>
    10. <param-name>ajaxPostContentType</param-name>
    11. <param-value>application/x-www-form-urlencoded</param-value>
    12. </init-param>
    13. -->
    14. </filter>
    这个方案就对前端没有任何要求,在使用ajax post数据时,不需要做任何处理(当然,前提是你要把contentType设置为application/x-www-form-urlencoded——不过在ajax post数据时本身就应该有这个要求)。
  • 我们今天的关于AJAX POST&跨域 解决方案 - CORSajax跨域请求解决方案的分享已经告一段落,感谢您的关注,如果您想了解更多关于ajax get 和 post 取 session 解决方案、AJAX POST & 跨域 解决方案 - CORS、AJAX POST&跨域 解决方案、Ajax Post请求中文乱码问题解决方案的相关信息,请在本站查询。

    本文标签: