栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

详解Spring Boot 2.0.2+Ajax解决跨域请求的问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解Spring Boot 2.0.2+Ajax解决跨域请求的问题

问题描述

后端域名为A.abc.com,前端域名为B.abc.com。浏览器在访问时,会出现跨域访问。浏览器对于javascript的同源策略的限制。

HTTP请求时,请求本身会返回200,但是返回结果不会走success,并且会在浏览器console中提示:

已拦截跨源请求:同源策略禁止读取位于 https://www.baidu.com/ 的远程资源。(原因:CORS 头缺少 ‘Access-Control-Allow-Origin')。

解决方案

1.jsonp

2.引用A站的js

3.Nginx做A站的反向代理

4.后端服务放开跨域请求

其中,以最后两种见常。

详细方案

本文主要描述第四种解决方案:后端服务放开跨域请求。

spring boot中放开跨域请求很简单。

1.增加一个configuration类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlbasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;


@Configuration
public class CustomCORSConfiguration {
 private CorsConfiguration buildConfig() {
 CorsConfiguration corsConfiguration = new CorsConfiguration();
 corsConfiguration.addAllowedOrigin("*");
 corsConfiguration.addAllowedHeader("*");
 corsConfiguration.addAllowedMethod("*");
 return corsConfiguration;
 }
 @Bean
 public CorsFilter corsFilter() {
 UrlbasedCorsConfigurationSource source = new UrlbasedCorsConfigurationSource();
 source.registerCorsConfiguration("
@Configuration
public class CustomCORSConfiguration {
 private CorsConfiguration buildConfig() {
 CorsConfiguration corsConfiguration = new CorsConfiguration();
 corsConfiguration.addAllowedOrigin("*");
 corsConfiguration.addAllowedHeader("*");
 corsConfiguration.addAllowedMethod("*");
 corsConfiguration.addExposedHeader("Content-Type");
 corsConfiguration.addExposedHeader( "X-Requested-With");
 corsConfiguration.addExposedHeader("accept");
 corsConfiguration.addExposedHeader("Origin");
 corsConfiguration.addExposedHeader( "Access-Control-Request-Method");
 corsConfiguration.addExposedHeader("Access-Control-Request-Headers");
 corsConfiguration.setAllowCredentials(true);
 return corsConfiguration;
 }
 @Bean
 public CorsFilter corsFilter() {
 UrlbasedCorsConfigurationSource source = new UrlbasedCorsConfigurationSource();
 source.registerCorsConfiguration("/**", buildConfig());
 return new CorsFilter(source);
 }
}

增加信息后,在前端依然需要调整AJAX请求,才能在非同源请求中携带cookie信息。

3.前端调整

$.ajax({
 url: 'http://beta.roboming.com/api.php?s=/Public/AdminLogin.html',
 type: 'POST',
 async:true,
 xhrFields:{
  withCredentials:true
 },
 data: {
  username:userName,
  password:pwd
 },
 success: function(respon){
  console.log(respon);
  var res=eval(respon);
 },
 error: function(){
  alert('服务器发生错误!');
 }
});

此时,当前端向后端服务做跨域请求时,增加

xhrFields:{
  withCredentials:true
},

就会带上cookie信息了,同理会带上token/sessionID等等内容。

测试方法

spring boot中增加一个controller

@Controller
public class LoginController {
 @RequestMapping(value = "setString")
 @ResponseBody
 public String setString(HttpServletRequest request, HttpServletResponse response,@RequestParam String value) {
 request.getSession().setAttribute("username", value);
 return "OK";
 }
 @RequestMapping(value = "getString")
 @ResponseBody
 public String getString(HttpServletRequest request, HttpServletResponse response) {
 String username = (String)request.getSession().getAttribute("username");
 return username;
 }
}

增加一个index.html,来访问跨域访问。




跨域请求






html文件可以单独本地访问即可出现效果,并不一定要形成服务访问。

当服务端不允许跨域访问时,html文件访问均报错,并调用失败。

当服务端允许跨域访问时,html请求访问成功。

当服务端开启cookie传递,并在html文件中增加 xhrFields参数时,session生效。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/138878.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号