最近自己在写后台管理系统的时候,并没有采用jsp、freemaker、叶子等模板技术,而是由后端提供数据api,前端通过AJAX和JQuery来动态操作页面上的一些div、table元素,从而实现报表的动态加载。

因为本人并非专业前端,所以采用的技术比较古老,对于最近的前端框架,vue,angular,react等等,暂且按下不表。

说说遇到的几个坑:

1、AJAX发送请求的时候,默认是异步的,而不是同步的。

基于低耦合的编码,我在写ajax时,数据请求和数据处理是分开的,没加同步执行就导致了我的请求发送后,没有拿到回调的数据就已经开始执行数据处理了。

2、关于非同源链接发送异地址的请求,也就是CORS,跨域问题。

浏览器出于安全考虑,限制了JS发起跨站请求,使用XHR对象发起请求必须遵循同源策略(SOP:Same Origin Policy),跨站请求会被浏览器阻止,这对开发者来说是很痛苦的一件事,尤其是要开发前后端分离的应用时。

在现代化的Web开发中,不同网络环境下的资源数据共享越来越普遍,同源策略可以说是在一定程度上限制了Web API的发展。

关于跨域问题,只要用ajax来发送请求都会遇到。上个月一直在做一个小程序应用的后端服务接口,前端的朋友并没有和我放映有跨域问题,估计是小程序底层做了比较良好的封装,或者底层并不是使用简单的ajax请求,从而规避了这个问题。

前端如果解决的话,无非就是jsonp,加请求头,但是这样会增加前端同事的工作量。

我的解决方案是在后端解决:

(1)最简陋的方法,在后端web中添加一个filter,这个filter要的过滤顺序放在最前面,将对应的HTTP请求加上一个请求头。

 1 /**
2 * 解决跨域问题
3 * Created by huxingyue on 2017/8/31.
4 */
5 @WebFilter(filterName = "CORSFilter")
6 public class CORSFilter implements Filter {
7 public void destroy() {
8 }
9
10 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
11 HttpServletResponse response = (HttpServletResponse) resp;
12 response.setHeader("Access-Control-Allow-Origin", "*");
13 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
14 response.setHeader("Access-Control-Max-Age", "3600");
15 response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
16 chain.doFilter(req, resp);
17 }
18
19 public void init(FilterConfig config) throws ServletException {
20
21 }
22
23 }

(2)使用@CrossOrigin注解

 1 @RestController
2 @RequestMapping("/account")
3 public class AccountController {
4
5 @CrossOrigin
6 @GetMapping("/{id}")
7 public Account retrieve(@PathVariable Long id) {
8 // ...
9 }
10
11 @DeleteMapping("/{id}")
12 public void remove(@PathVariable Long id) {
13 // ...
14 }
15 }

这是一个很简单的示例,官方参考文档还有更加全面的示例。

 1 <mvc:cors>
2
3 <mvc:mapping path="/api/**"
4 allowed-origins="http://domain1.com, http://domain2.com"
5 allowed-methods="GET, PUT"
6 allowed-headers="header1, header2, header3"
7 exposed-headers="header1, header2" allow-credentials="false"
8 max-age="123" />
9
10 <mvc:mapping path="/resources/**"
11 allowed-origins="http://domain1.com" />
12
13 </mvc:cors>

参考文档:http://spring.io/blog/2015/06/08/cors-support-in-spring-framework

(3)使用第三方CORSFilter

官网:http://software.dzhuvinov.com/cors-filter.html

3、AJAX发送post请求,数据为json时,data对应的内容应该是json字符串,而不是json字符串

参考资料:

http://start.spring.io/

http://www.jianshu.com/p/d05303d34222

前端-关于CORS跨域的解决方案,面向服务端的更多相关文章

  1. 跨域常见解决方案jsonp,cors示例

    ​​ 方案   JSONP jsonp需要后端进行配置,并且前端需要动态生成script标签通过callback调用函数进行操作的跨域解决方案 不建议使用该方案: 前后端均需进行配置处理,增加了工作量 ...

  2. 【从零开始搭建自己的.NET Core Api框架】(五)由浅入深详解CORS跨域机制并快速实现

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  3. js跨域请求解决方案

    什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交 2.) 资源嵌入: <link>.&l ...

  4. 关于CORS跨域更细节的思考

    权威的资料看MDN,也可以看阮一峰的文章.不过感觉阮一峰对于CORS的描述有问题,简单请求被阮一峰描述为2次浏览器请求了.这个要自己搭个服务器试一下.跨域基本都是根据域名判断的,自己是否要再买个域名呢 ...

  5. ajax跨域问题解决方案(jsonp,cors)

    跨域 跨域有三个条件,满足任何一个条件就是跨域 1:服务器端口不一致 2:协议不一致 3:域名不一致 解决方案: 1.jsonp 在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用 ...

  6. C#进阶系列——WebApi 跨域问题解决方案:CORS

    前言:上篇总结了下WebApi的接口测试工具的使用,这篇接着来看看WebAPI的另一个常见问题:跨域问题.本篇主要从实例的角度分享下CORS解决跨域问题一些细节. WebApi系列文章 C#进阶系列— ...

  7. CORS 跨域 实现思路及相关解决方案

    本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...

  8. WebApi 跨域问题解决方案:CORS

    注:本文为个人学习摘录,原文地址:http://www.cnblogs.com/landeanfen/p/5177176.html 前言:上篇总结了下WebApi的接口测试工具的使用,这篇接着来看看W ...

  9. C#进阶系列——WebApi 跨域问题解决方案:CORS(转载)

    C#进阶系列——WebApi 跨域问题解决方案:CORS   阅读目录 一.跨域问题的由来 二.跨域问题解决原理 三.跨域问题解决细节 1.场景描述 2.场景测试 四.总结 正文 前言:上篇总结了下W ...

随机推荐

  1. kNN-画图

    现在我们想要展示一些可视化内容 首先导包,如果是在jupyter notebook上,需要加入魔法函数:%matplotlib inline,这表示可以在jupyter上直接画图 import dat ...

  2. 【理论积累】C语言基础理论知识【第一版】

    第一个程序 #include <stdio.h> int main(){ printf("Hello World"); } 变量与常量 变量类型:整型[int].字符型 ...

  3. ELK 1.4 logstash各种插件

      kibana各种插件: 1.过虑插件 kv (1)KV插件:接收一个键值数据,按照指定分隔符解析为Logstash 事件中的数据结构,放到事件顶层.  常用字段:    • field_split ...

  4. Spring Boot 动态修改 log level

    引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  5. 105_Power Pivot财务科目(层级深度&筛选深度)

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 在财务科目中,需要按照科目层级来显示:在excel中都是用公式来实现,而且对于数据的管理及更新是一件头痛的事情, ...

  6. Sentinel介绍与使用 收藏起来

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 前言 在家休息的的时候,突然小勇打 ...

  7. Android源码环境生成Android SDK并导入Adnroid Studio

    1.发现问题 之前使用Repo同步Android源码使用的是下面这条指令,即同步的是分支android-7.1.2_r18的代码 repo init -u https://mirrors.tuna.t ...

  8. Android7.1.2 源码编译并烧写Nexus5X

    1.环境配置 Ubuntu18.04 openJDK1.8 Python2.7 2.更新Ubuntu镜像源 编辑/etc/apt/source.list,替换为以下内容 deb http://mirr ...

  9. A* K短路

    注:\(A*\) 求解K短路效率极其低下,时间复杂度\(O(nklog\ n)\),空间视题目而定,因为本质是爆搜,可求解数据范围较小的题目. 我们使用\(A*\)求解k短路: 首先需要预处理出估价函 ...

  10. CF1682C. LIS or Reverse LIS?

    题意:给\(n\)个数,问你能构出严格上升子序列长度和下降子序列长度最小值的最大值. 思路: 如果一个数出现至少两次,ans++. 统计出现一次的个数,因为再最长上升子序列中,只能有一个值能贡献到下降 ...