• SpringBoot22 Ajax跨域、SpringBoot返回JSONP、CSRF、CORS


    1 扫盲知识

      1.1 Ajax为什么存在跨域问题

        因为浏览器处于安全性的考虑不允许JS执行跨域请求。

      1.2 浏览器为什么要限制JS的跨域访问

        如果浏览器允许JS的跨域请求就很容易造成 CSRF (Cross-site request forgery),中文名称:跨站请求伪造,缩写为:CSRF/XSRF。

      1.3 什么是CSRF

        

    2 Ajax如何实现跨域访问

      2.1 利用JSONP实现

        技巧01:如果Ajax指定的数据类型为JSONP时,后台接口必须支持返回JSONP格式

    3 SpringBoot设置支持响应数据类型为JSONP

      3.1 写一个配置文件即可

    package cn.xiangxu.demo_code.commons.config;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.AbstractMappingJacksonResponseBodyAdvice;
    
    /**
     * @author 王杨帅
     * @create 2018-07-19 22:40
     * @desc JSONP跨域支持配置
     **/
    @ControllerAdvice
    public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
        public JsonpAdvice() {
            super("callback","jsonp");
        }
    }
    View Code

      3.2 编写一个测试类

        技巧01:响应数据必须是一个对象

    package cn.xiangxu.demo_code.web;
    
    import cn.xiangxu.demo_code.commons.configProperties.SftpProperties;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author 王杨帅
     * @create 2018-07-17 8:53
     * @desc 测试控制类
     **/
    @RestController
    @RequestMapping(value = "/test")
    @Slf4j
    public class TestController {
    
        @GetMapping(value = "/connect")
        public Map connect() {
            String result = "前后端连接成功_王杨帅";
            log.info(result);
            Map<String, Object> testData = new HashMap<>();
            testData.put("testData", result);
            return testData;
        }
    
    }
    View Code

      》测试返回JSON格式的响应数据

      》测试返回JSONP格式的响应数据

     

    4 CORS

      4.1 扫盲知识

        当后台不支持跨域请求时,无论你前台怎么使劲也是白搭;【AJAX使用JSONP时除外】;

        只要后台支持了跨域请求,就可以接收前台的跨域请求了

      4.2 SpringBoot开启跨域请求

        利用 @CrossOrigin 注解实现,该注解可以在类和方法上使用

        技巧01:使用JSOP跨域时,后台不需要开启跨域请求,因为人家JSOP解决跨域时本能就是可以访问跨域资源的,只要得到的响应数据是JSONP格式就可以啦

    5 总结

      5.1 解决跨域问题的方法

        》前端解决:JSONP、代理服务器

        》后端解决:开启跨域支持

      5.2 后台开启了跨域支持,通过浏览器访问时失败

        》问题:这是因为浏览器层面对JS发出的跨域请求进行了拦截,目的是为了防止 CSRF(跨站请求伪造)

        》解决:前端的跨站请求使用JSONP,后端响应的数据格式为JSONP格式即可

        》技巧01:前端使用JSONP时,后端只需要返回JSONP格式的响应数据即可,不用支持跨站请求

        》技巧02:前端使用Angualr或者Ionic开发时可以使用一个配置文件配置一个代理服务器

  • 相关阅读:
    Atitit sql计划任务与查询优化器统计信息模块
    Atitit  数据库的事件机制触发器与定时任务attilax总结
    Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx
    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
    Atiti 数据库系统原理 与数据库方面的书籍 attilax总结 v3 .docx
    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
    Atitit View事件分发机制
    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
    Atitti 存储引擎支持的国内点与特性attilax总结
    Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
  • 原文地址:https://www.cnblogs.com/NeverCtrl-C/p/9339942.html
Copyright © 2020-2023  润新知