Java中跨域问题解决的几种方式举例详解

 更新时间:2024年12月25日 11:13:05   作者:A_aspectJ项目开发  
这篇文章主要介绍了前后端分离项目中跨域问题的解决方法,包括设置响应头信息、使用iframe、WebSocket、HttpServletResponse添加头信息以及通过配置类等多种方式,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在前后端分离项目中,经常会遇到跨域问题,文中通过实例代码介绍的非常详细,需要的朋友可以参考下,一起来看看吧~

什么是跨域

当一个请求的url的协议、域名、端口任意一个与当前页面的url不同即为跨域。

比如 a页面想获取b页面的资源,a与b页面的协议、域名或端口号不同,进行的访问行为都是跨域,由于浏览器的同源策略,会限制跨域请求资源。

同源策略由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同":

  • 协议相同
  • 域名相同
  • 端口相同

同源策略确保一个应用中的资源只能被本应用的资源访问。

非同源限制

  • cookie、localStorage、indexDB无法读取
  • DOM和js对象无法获取
  • 无法发送Ajax请求

Java 中的跨域问题指的是在使用 Ajax 技术进行跨域访问时,由于浏览器的安全限制,导致请求被拒绝或者无法获取到正确的响应结果。

解决 Java 中的跨域问题可以采用以下几种方式:

1、通过设置响应头信息来支持跨域访问。

在 Java 中可以通过设置响应头信息来支持跨域访问,例如在 Spring MVC 中可以使用

//@CrossOrigin 注解来设置允许跨域访问的源地址:
@CrossOrigin(origins = "http://localhost:8080")
@RequestMapping("/api")
@RestController
public class ApiController {
    // ...
}

2、使用 iframe 来实现跨域访问。

可以通过在同一页面中使用 iframe 元素来实现跨域访问,从而避免了浏览器安全限制。例如在前端页面中可以通过以下方式来获取来自不同域名的数据:

var iframe = document.createElement('iframe');
iframe.src = 'http://exampleURL.com/data';
iframe.style.display = 'none';
document.body.appendChild(iframe);
var data = iframe.contentWindow.document.body.innerText;
console.log(data);

 或前端发送ajax请求

    $("#test").click(function(){
        $.ajax({
            url : "http://localhost:8082/hello.cors",
            type : "GET",
            success : function(result){
                // alert(result);
                console.log(result)
            }
        })
    })

3、使用 WebSocket 来解决跨域问题。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/data").setAllowedOrigins("*");
    }
}

4、HttpServletResponse添加头信息

@RestController
public class CorsController {
​
    @RequestMapping(value = "/hello.cors")
    public String hello(HttpServletResponse response){
        response.addHeader("Access-Control-Allow-Origin","http://localhost:8081");
        //response.addHeader("Access-Control-Allow-Credentials","true");
        return "hello cors";
    }
    
}

5、通过配置类解决跨域

使用HttpServletResponse对象或注解方式,需要在每个需要跨域的方法上都加上相应的注解或参数,我们想让所有的controller都添加跨域功能,我们可以通过实现WebMvcConfigurer接口来自定义跨域配置。

WebMvcConfigurer是一个接口,提供很多自定义的拦截器,例如跨域设置、类型转化器等springMVC的配置

@Configuration
public class CorsConfig implements WebMvcConfigurer {
​
    /**
     * **addMapping**:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
     *
     * **allowedMethods**:允许所有的请求方法访问该跨域资源服务器,如:POST、GET、PUT、DELETE等。
     *
     * **allowedOrigins**:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:”[http://www.address.com](http://www.address.com/)“,只有该域名可以访问我们的跨域资源。
     *
     * **allowedHeaders**:允许所有的请求header访问,可以自定义设置任意请求头信息。
     
     * @param registry
     */
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/*.cors")
                .allowedOrigins("http://localhost:8081")
                .allowedMethods("POST","GET")
                .maxAge(1000);
    }
}

总结 

到此这篇关于Java中跨域问题解决的几种方式的文章就介绍到这了,更多相关Java跨域问题解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 剑指Offer之Java算法习题精讲链表与二叉树专项训练

    剑指Offer之Java算法习题精讲链表与二叉树专项训练

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • common-upload上传文件功能封装类分享

    common-upload上传文件功能封装类分享

    本文介绍一个common-upload上传封装类,为了更方便的上传文件,对common-upload进行了一个简单的封装,大家参考使用吧
    2014-01-01
  • 基于JAVA中的四种JSON解析方式详解

    基于JAVA中的四种JSON解析方式详解

    这篇文章主要介绍了基于JAVA中的四种JSON解析方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 在windows下揪出java程序占用cpu很高的线程并完美解决

    在windows下揪出java程序占用cpu很高的线程并完美解决

    这篇文章主要介绍了在windows下揪出java程序占用cpu很高的线程并完美解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 使用Springboot整合GridFS实现文件操作

    使用Springboot整合GridFS实现文件操作

    这篇文章主要介绍了使用Springboot整合GridFS实现文件操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java集合与数组区别简介及相互转换实例

    Java集合与数组区别简介及相互转换实例

    这篇文章主要介绍了Java集合与数组区别简介及相互转换实例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 利用java批量给pdf加水印的方法示例

    利用java批量给pdf加水印的方法示例

    这篇文章主要介绍了利用java批量给pdf加水印的方法,文中给出了简单的示例代码,需要的朋友可以参考借鉴,下面来一起看吧。
    2017-03-03
  • Spring AOP的五种通知方式代码实例

    Spring AOP的五种通知方式代码实例

    这篇文章主要介绍了Spring AOP的五种通知方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • MyBatis-Plus 动态表名SQL解析器的实现

    MyBatis-Plus 动态表名SQL解析器的实现

    这篇文章主要介绍了MyBatis-Plus 动态表名SQL解析器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java实现在线聊天功能

    Java实现在线聊天功能

    这篇文章主要为大家详细介绍了Java实现在线聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09

最新评论