范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringBoot跨域问题

  一、同源策略
  同源策略是由Netscape提出的一个著名的安全策略,它是浏览器最核心也最基本的安全功能,现在所有支持JavaScript的浏览器都会使用这个策略。所谓同源是指 协议  、域名  以及端口  要相同。同源策略是基于安全方面的考虑提出来的,这个策略本身没问题,但是我们在实际开发中,由于各种原因又经常有跨域的需求,传统的跨域方案是JSONP,JSONP虽然能解决跨域但是有一个很大的局限性,那就是只支持GET请求,不支持其他类型的请求,而今天我们说的CORS(跨域源资源共享)(CORS,Cross-origin resource sharing)是一个W3C标准,它是一份浏览器技术的规范,提供了Web服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,这是JSONP模式的现代版。
  在Spring框架中,对于CORS也提供了相应的解决方案。 非同源限制无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB 无法接触非同源网页的 DOM 无法向非同源地址发送 AJAX 请求 二、java后端实现CORS跨域请求的方式返回新的CorsFilter 重写 WebMvcConfigurer 使用注解 @CrossOrigin 手动设置响应头 (HttpServletResponse) 自定web filter 实现跨域
  注意: CorFilter / WebMvConfigurer / @CrossOrigin   需要 SpringMVC 4.2以上版本才支持,对应springBoot 1.3版本以上上面前两种方式属于全局 CORS 配置,后两种属于局部 CORS配置。如果使用了局部跨域是会覆盖全局跨域的规则,所以可以通过 @CrossOrigin 注解来进行细粒度更高的跨域资源控制。 其实无论哪种方案,最终目的都是修改响应头,向响应头中添加浏览器所要求的数据,进而实现跨域 1.返回新的 CorsFilter(全局跨域)
  在任意配置类,返回一个 新的 CorsFIlter Bean ,并添加映射路径和具体的CORS配置路径。  @Configuration  public class GlobalCorsConfig {      @Bean      public CorsFilter corsFilter() {          //1. 添加 CORS配置信息          CorsConfiguration config = new CorsConfiguration();          //放行哪些原始域          config.addAllowedOrigin("*");          //是否发送 Cookie          config.setAllowCredentials(true);          //放行哪些请求方式          config.addAllowedMethod("*");          //放行哪些原始请求头部信息          config.addAllowedHeader("*");          //暴露哪些头部信息          config.addExposedHeader("*");          //2. 添加映射路径          UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();          corsConfigurationSource.registerCorsConfiguration("/**",config);          //3. 返回新的CorsFilter          return new CorsFilter(corsConfigurationSource);      }  }2. 重写 WebMvcConfigurer(全局跨域) @Configuration  public class CorsConfig implements WebMvcConfigurer {      @Override      public void addCorsMappings(CorsRegistry registry) {          registry.addMapping("/**")                //是否发送Cookie                .allowCredentials(true)                //放行哪些原始域                .allowedOrigins("*")                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})                .allowedHeaders("*")                .exposedHeaders("*");      }  }3. 使用注解 (局部跨域)
  在控制器(类上)上使用注解  @CrossOrigin  :,表示该类的所有方法允许跨域。 @RestController  @CrossOrigin(origins = "*")  public class HelloController {      @RequestMapping("/hello")      public String hello() {          return "hello world";      }  }
  在方法上使用注解 @CrossOrigin:  @RequestMapping("/hello")  @CrossOrigin(origins = "*")  //@CrossOrigin(value = "http://localhost:8081") //指定具体ip允许跨域  public String hello() {      return "hello world";  }4. 手动设置响应头(局部跨域)
  用HttpServletResponse添加响应头Access-Control-Allow-Origin授权原始域,这里 Origin的值也可以设置为 "*",表示全部放行。  @RequestMapping("/index")  public String index(HttpServletResponse response) {      response.addHeader("Access-Allow-Control-Origin","*");      return "index";  }5. 使用自定义filter实现跨域
  首先编写一个过滤器,可以起名字为MyCorsFilter.java  @Component  public class MyCorsFilter implements Filter {      public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {          HttpServletResponse response = (HttpServletResponse) res;          response.setHeader("Access-Control-Allow-Origin", "*");          response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");          response.setHeader("Access-Control-Max-Age", "3600");          response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");          chain.doFilter(req, res);      }       public void init(FilterConfig filterConfig) {}       public void destroy() {}  }
  在web.xml中配置这个过滤器,使其生效        CorsFilter    com.mesnac.aop.MyCorsFilter        CorsFilter    /*    三、例子
  首先创建两个普通的SpringBoot项目,第一个命名为provider提供服务,第二个命名为consumer消费服务,第一个配置端口为8080,第二个配置配置为8081,然后在provider上提供两个hello接口,一个get,一个post,如下:  @RestController  public class Provider {      @GetMapping("/hello")      public String hello() {          return "hello";      }        @PostMapping("/hello")      public String hello2() {          return "post hello";      }  }
  在consumer的resources/templates目录下创建一个html文件,发送一个简单的ajax请求,如下:               CORS                              
  然后分别启动两个项目,发送请求按钮,观察浏览器控制台如下:
  Access to XMLHttpRequest at "http://localhost:8080/hello" from origin "http://localhost:8081" has been blocked by CORS policy: No "Access-Control-Allow-Origin" header is present on the requested resource
  可以看到,由于同源策略的限制,请求无法发送成功。
  使用CORS可以在前端代码不做任何修改的情况下,实现跨域,那么接下来看看在provider中如何配置。首先可以通过@CrossOrigin注解配置某一个方法接受某一个域的请求,如下: @RestController public class Provider {     @CrossOrigin(value = "http://localhost:8081")     @GetMapping("/hello")     public String hello() {         return "hello";     }      @CrossOrigin(value = "http://localhost:8081")     @PostMapping("/hello")     public String hello2() {         return "post hello";     } }
  这个注解表示这两个接口接受来自http://localhost:8081地址的请求,配置完成后,重启provider,再次发送请求,浏览器控制台就不会报错了,consumer也能拿到数据了。
  provider上,每一个方法上都去加注解未免太麻烦了,在Spring Boot中,还可以通过全局配置一次性解决这个问题,全局配置只需要在配置类中重写addCorsMappings方法即可,如下: @Configuration public class WebMvcConfig implements WebMvcConfigurer {     @Override     public void addCorsMappings(CorsRegistry registry) {         registry.addMapping("/**")                 .allowedOrigins("http://localhost:8081")                 .allowedMethods("*")                 .allowedHeaders("*");     } }
  /**  表示本应用的所有方法都会去处理跨域请求,allowedMethods表示允许通过的请求数,allowedHeaders则表示允许的请求头。经过这样的配置之后,就不必在每个方法上单独配置跨域了。四、存在的问题
  了解了整个CORS的工作过程之后,我们通过Ajax发送跨域请求,虽然用户体验提高了,但是也有潜在的威胁存在,常见的就是CSRF(Cross-site request forgery)跨站请求伪造。跨站请求伪造也被称为one-click attack 或者 session riding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,举个例子:
  假如一家银行用于运行转账操作的URL地址如下: //img01.bs178.com/aj/rm/797c6e0c8941fc3a.jpg  ,那么,一个恶意攻击者可以在另一个网站上放置如下代码:  ,如果用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会遭受损失。
  基于此,浏览器在实际操作中,会对请求进行分类,分为简单请求,预先请求,带凭证的请求等,预先请求会首先发送一个options探测请求,和浏览器进行协商是否接受请求。默认情况下跨域请求是不需要凭证的,但是服务端可以配置要求客户端提供凭证,这样就可以有效避免csrf攻击。

原神的3个冷知识NPC会鼓掌锅巴是魔神璃月在悄然转型原神里有很多有趣的冷知识,比如提瓦特没有马璃月没有鸡稻妻的狐狸无法攻击等等。今天怪力瓦舍整理里一些有趣的冷知识,不妨一起来看看吧。释放技能NPC会鼓掌玩家释放技能时,NPC会鼓掌,eStarPro41战胜TTG,论如何打出超强压制力1线权优势队伍所选英雄是否具备线权优势直接影响了队伍前期的攻防能力,如eStarPro唯一输掉的对局中,便是由于同时拿了不知火舞伽罗孙膑,不知火舞对线西施无线权优势,伽罗对线公孙离原神2。4前瞻速览,钟离确认复刻,云堇待机有京剧语音各位好呀,我是助手。备受猜测期待的2。4版本,终于迎来了前瞻,除了一些早已被推上先知预测的内容外,还有部分存疑内容,那么不多说,看看本次的前瞻都会有哪些内容,好提前规划准备原石。开王者荣耀甄姬女儿国皮肤PV上线,黄白配色绝妙,不输典藏皮王者荣耀S26赛季皮肤刚给到达摩不久,又趁热打铁的放出了联动的第三款皮肤,将甄姬女儿国国王的皮肤PV放了出来。而这次的甄姬不仅拥有了女儿国国王的身份,全身黄白配色典雅大方,丝毫不输不可思议!38岁国乒世界冠军打败日本主力,郝帅116胜丹羽孝希2022年1月8日,日本乒乓球T联赛上演了一场非常精彩的对决38岁的国乒世界冠军郝帅老当益壮,在31击败曾根翔后与日本国家队的奥运主力丹羽孝希(27岁)碰头,结果双方在一局定胜负的941天后回归,克雷汤普森宣布明天主场战骑士复出勇士后卫克雷汤普森宣布复出,他在视频中说道勇士国度,我回来了。汤普森将在下周一(明天)主场对阵骑士复出。汤普森在2019年总决赛G6遭遇左膝前交叉韧带撕裂,缺席了整个201920赛西甲1降至第6吕克德容连场进球加维染红北京时间1月9日凌晨1点30分,20212022赛季西甲联赛第20轮迎来一场焦点战,巴塞罗那去到客场挑战格拉纳达。上半场,双方都没有进球下半场,老将阿尔维斯送出助攻,吕克德容连场破莫兰特缺阵杰克逊26分3断5帽,灰熊轻取快船获8连胜灰熊123108轻取快船获得8连胜,27胜14负坐稳西部第四,快船遭遇3连败。莫兰特因为大腿酸疼缺阵。开场祖巴茨篮下得手,雷吉杰克逊连中三分砍下8分,莫里斯也命中远投,快船134领广东新外援莱多曾被叫菜多,让CBA大数据告诉我们真的菜吗?主力阵容老化,威姆斯状态一般,马尚未归,赵睿因为家事缺席,广东队进入第二阶段以来走得磕磕绊绊。明眼人都知道,现在广东队无法内部挖潜,仅靠胡明轩和徐杰两个年轻人也无法掌控大局。为了应你二哥还是你二哥,大伤之后李晓旭油箱依然是满的本场辽宁男篮对阵北京首钢,首发出场的李晓旭贡献12分6篮板3助攻5抢断!是辽宁锋线上一大收获。谁又能想到,年过三十,受过两次大伤的二哥还能有这样的表现?生涯晚期,李晓旭的投篮与罚篮32分8板9助!就在今天,2项前无古人的NBA纪录被詹姆斯达成了北京时间1月8日,NBA常规赛继续进行,洛杉矶湖人队在主场迎战亚特兰大老鹰队。湖人队近期渐入佳境,连续击败开拓者森林狼和国王,喜提一波3连胜。老詹火力全开,威少甘当绿叶,安东尼蒙克
又闯祸了!国足名将在训练场抽烟玩手机,被曝光,引起韩媒嘲讽北京时间4月11日,国足名将郜林成为了大家热议的话题,郜林被媒体人李平康曝出带着中华烟来到训练场边。并且配上一张图片和一段话,李永平说道说到欠薪以及各种奇葩政策,我永远是同情和支持辽宁男篮遭遇大麻烦!对阵广东男篮或被横扫,球迷非常伤心辽宁男篮遭遇大麻烦!对阵广东男篮或被横扫,球迷非常伤心亲情提示亲爱的读者,如何能每天能读到这样的体育资讯呢?点击右上角的关注按钮即可,您的关注将是我创作的最大动力!CBA季后赛继续2年9710万!湖人续约詹姆斯,效仿科比进行巡演北京时间4月11日,NBA常规赛正在火热进行中,在刚刚结束的一场西部比赛中,湖人客场146比141战胜掘金,取得两连胜的同时,最终以33胜49负战绩,排名西部第十一,遗憾错失本赛季为谢恩师,奥运冠军不仅赠送百万豪车还以身相许,母亲表示理解前言感恩是中华传统美德当中的其中一个,受到她人的恩惠要铭记在心,并且在未来有能力之时要取得回报,学会回报她人,在未来才能够做得更加长远,拥有一个感恩之心,无论是对于个人还是对于外界全民偶像!谷爱凌火出圈,现象级运动员,能否超越刘翔姚明李娜近日谷爱凌的馅饼又火出圈,她在表彰大会期间被提到馅饼,之后还在社交媒体上发文称自己又吃到心爱的馅饼。谷爱凌还当着记者的面,弹起了钢琴,称这是冻馅饼之歌,因为自己比赛的时候,天气很冷NBA常规赛西部最终排名!太阳灰熊创历史湖人尴尬火箭垫底4月11日,NBA常规赛82场比赛全部结束,对于东西部前10名的球队来说,真正的考验才开始,因为他们要备战对抗更加激烈的季后赛了,但对于有些球队来说,本赛季的任务结束了,他们的假期12位中老年女星颜值崩坏两大原因,发福成大妈,脸僵面目全非都说岁月留不住美人,在大家的童年记忆里一定有着不少曾经惊艳过你一整个青春的女神,但随着年龄的增长,那些曾风华绝代的美女也逐渐颜值崩坏,已经不见往日的风采了,在这些人里,有的是因为脸何赛飞5岁被母抛弃,后嫁恩师儿子恩爱34年,58岁上央视风韵犹存何赛飞一身华美戏服行当,头梳精致发髻一颦一笑眼波流转,顾盼生姿。这是22岁的越剧名角何赛飞。一袭艳丽开叉旗袍,脚踩细长高跟一喜一怒风情万种,勾人心魄。这是30岁的著名女演员何赛飞。郭富城小女儿迎3岁生日,方媛晒庆生照,穿旧衣服出镜被赞节俭4月10日晚,天王嫂方媛在个人社交平台分享出一组美照,并开心写道新发型,显发量的公主头,最近看了部电影,女主的公主头好美呀,不过我的头发不够长,因为刚剪完。即便已经是两个孩子的妈妈为何夹在北京和天津两大直辖市之间的廊坊不是经济强市呢?我国北方最大的两个城市为首都北京市以及直辖市天津,在北京和天津之间坐落着一座隶属于河北省的地级市,那就是廊坊市。按理说,廊坊市夹在北京和天津之间,应该会发展成为一座经济强市,但是事2021年北方区县人均收入前50强榜单!北京包揽前6,青岛表现不俗按照地理划分,秦岭淮河一线是属于我国的北方地区,有着深厚的历史文化基础。在我国工业化早期,曾涌现过诸多工业实力雄厚的城市,经济基础较好。虽然在近几十年南方经济的崛起之势迅猛,在经济