专栏首页芋道源码1024Spring MVC 的跨域解决方案

Spring MVC 的跨域解决方案

来源:cnblogs.com/wangsen/p/8316039.html

  • 什么是跨域
  • 为什么非得跨域
  • spring使用jsonp解决跨域
  • 使用CORS(跨域资源共享)解决跨域问题

什么是跨域

一句话:同一个ip、同一个网络协议、同一个端口,三者都满足就是同一个域,否则就是跨域。

为什么非得跨域

基于两个方面:

a. web应用本身是部署在不同的服务器上 b.基于开发的角度 --- 前后端分离 web应用本身是部署在不同的服务器上,对应的域名也就有所不同 比如百度。 主域名:https://www.baidu.com/ 二级域名:http://image.baidu.com/, http://music.baidu.com/,http://wenku.baidu.com/ 需要在不同的域之间,通过ajax方式互相请求,是非常常见的需求。

spring使用jsonp解决跨域

Spring 4中增加了对jsonp的原生支持,只需要ControllerAdvice就可以开启,方法如下: 首先新建一个Advice类,我们叫做“JsonpAdvice”,然后在里面定义接收jsonp请求的参数key:

package cn.isuyang.web.sso.advice;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;
/**
* 使用jsonp实现跨域的支持
* @author  WangSen(wangsenhehe@126.com)
* @Date    2018年1月8日
*/
@ControllerAdvice("cn.isy.web.sso.web")
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
    public JsonpAdvice() {
        super("callback");
    }
}

@ControllerAdvice("cn.isy.web.sso.web")指定作用的包名 supper("callback")指定的是url中callback: http://sso.isy.cn/logout?callback=successCallback

注意: 我们还可以重写AbstractJsonpResponseBodyAdvice中的feforeBodyWriteInternal方法: 做到实现url携带callback就返回jsonp格式,没有就返回正常格式

controller中

controller中的代码正常编写就OK,不用修改任何东西。 只要保证在cn.isy.web.sso.web包下即可!

jquery ajax

注意:必须使用jsonp的方式提交请求!

$.ajax({
                type : "get",
                async:false,
                dataType:'jsonp',
                url: 'http://sso.isy.cn/login.json',
                data: $("#loginForm").serialize(),
                crossDomain: true,
                jsonpCallback:"successCallback",
                xhrFields: {
                    withCredentials: true
                },
                success : function(data){

                },
                error:function(data){
                    console.log("登录出错");
                    $.we.utils.gotoUrl("/");
                }
            });

使用CORS(跨域资源共享)解决跨域问题

有关cors的介绍可以去详细看一下,这里就不作重复了: CORS详解 跨资源共享CORS详解

主要配置

Access-Control-Allow-Origin:  http://www.YOURDOMAIN.com            // 设置允许请求的域名,多个域名以逗号分隔
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS      // 设置允许请求的方法,多个方法以逗号分隔
Access-Control-Allow-Headers: Authorization                        // 设置允许请求自定义的请求头字段,多个字段以逗号分隔
Access-Control-Allow-Credentials: true                              // 设置是否允许发送 Cookies

使用注解CrossOrigin

在controller类上添加CrossOrigin注解表示当前类中的所有入口函数都 可以实现跨域。也可以指定某个conroller中具体的方法。

了解一下这个注解的内容:

jquery ajax的写法

注意:这里不用使用jsonp的方式请求普通的ajax即可!,因为浏览器自己可以去做!

            $.ajax({
                type : "get",
                url: 'http://sso.isy.cn/login.json',
                data: $("#loginForm").serialize(),
                xhrFields: {
                    withCredentials: true //注意这里必须指定否则cookie无法传递过去
                },
                success : function(data){

                },
                error:function(data){
                    console.log("登录出错");
                    $.we.utils.gotoUrl("/");
                }
            });

CORS全局配置

https://www.jianshu.com/p/d05303d34222 自己试了试没有成功!

资料

解释cors的原理不错 https://zhuanlan.zhihu.com/p/24411090

本文分享自微信公众号 - 芋道源码(javayuanma),作者:王森

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多图 | 如何告别那些没卵用的线上告警!

    没有多少系统的告警是设计得当的。良好的告警设计是一项非常困难的工作。如何知道你收到的告警是糟糕的?多少次你收到了告警之后,立即就关掉了的?是不是成天被这些然而并...

    芋道源码
  • 芋道 Spring Boot MyBatis 入门(四)之 tkmybatis

    摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/MyBatis/ 「芋道源码」欢迎转载,保留摘要,谢谢!

    芋道源码
  • 源码级别解读 mybatis 插件

    简介: ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以...

    芋道源码
  • Spring MVC 的跨域解决方案

    一句话:同一个ip、同一个网络协议、同一个端口,三者都满足就是同一个域,否则就是跨域。

    一个优秀的废人
  • Spring Mvc的跨域解决方案

    一句话:同一个ip、同一个网络协议、同一个端口,三者都满足就是同一个域,否则就是跨域。

    良月柒
  • LiteAVSDK商业版6.6+,安卓集成动态加载so

    本篇文章主要介绍集成LiteAVSDK商业版、6.6以上的版本,安卓端采用动态加载so的方式时的写法。

    腾讯云-chaoli
  • 蒂花之秀缔造者携域名mingchen.com.cn上市

    蒂花之秀,是名臣健康旗下的实力日化品牌,当年的广告词:“蒂花之秀,青春好朋友”可谓是红遍大江南北,“蒂花之秀”的缔造者---名臣健康近日登陆资本市场...

    躲在树上的域小名
  • error LNK2019: 无法解析的外部符号

    最近在写与驱动程序通信的Windows应用程序,在VS2013编译时出现了“error LNK2019:无法解析的外部符号”的错误。

    用户7043923
  • 【译】Spring官方教程:使用STS的入门指南

    原文:Working a Getting Started guide with STS 译者:hanbin 校对:Mr.lzc 这个指南引导您使用 Spring...

    程序猿DD
  • Go语言使用protobuf数据通信--师出同门,懂的人理解吧

    protobuf作为通信方式,之前在做APP的时候实际用过,5月份服务器架构我准备使用protobuf作为前端和服务器的通信方式 给大家免费讲解下通...

    李海彬

扫码关注云+社区

领取腾讯云代金券