JAVA WEB之跨域问题以及解决方案(上)

本文详细介绍了JAVA WEB中的跨域问题及其解决方案,包括HTTP访问控制(CORS)机制,以及@CrossOrigin注解、设置头部信息、配置拦截器等实践方法。
摘要由CSDN通过智能技术生成

目录

一、产生跨域的原因
二、错误描述
三、HTTP访问控制(CORS)
四、解决方案
      1、@CrossOrigin 注解
      2、设置头部信息
      3、配置拦截器
      4、web.xml配置
      5、HttpClient 转发请求
      6、spring-context.xml配置
五、带token的跨域问题解决方案


JAVA WEB之跨域问题以及解决方案(下)

一、产生跨域的原因

我们在项目开发中,经常会使用前后端分离的技术,把前端代码和后端代码分别部署到不同的服务器上,这样在数据交互的时候,由于浏览器的同源策略,就会产生跨域问题。

同源策略,它是由Netscape提出的一个著名的安全策略。
现在所有支持JavaScript 的浏览器都会使用这个策略。
所谓同源是指,域名,协议,端口相同。
如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。

http://www.a.com:8080/b.js

二、错误描述

Failed to load https://example.com/: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘https://anfo.pl’ is therefore not allowed access. If an opaque response serves your needs, set the request’smode to ‘no-cors’ to fetch the resource with CORS disabled.
在这里插入图片描述
在这里插入图片描述

三、HTTP访问控制(CORS)

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个指定域名上的Web应用被准许访问来自不同源服务器上的指定的资源。

  • 简单请求:不会触发 CORS 预检请求(GET、HEAD、POST)
  • 预检请求:必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。(PUT、DELETE、CONNECT、OPTIONS、TRACE PATCH)
  • HTTP 响应首部字段:Access-Control-Allow-Origin、Access-Control-Expose-Headers、Access-Control-Max-Age、Access-Control-Allow-Credentials、Access-Control-Allow-Methods、Access-Control-Allow-Headers(在下文使用时,再做详细介绍)
  • HTTP 请求首部字段:Origin、Access-Control-Request-Method、Access-Control-Request-Headers(在下文使用时,再做详细介绍)

更多CORS的细节…

四、解决方案
1、@CrossOrigin 注解
  • 适用于jdk 1.8及以上
  • @CrossOrigin:允许所有ip跨域访问
  • @CrossOrigin(origins=“xxx.xxx.xxx.xxx”):只允许指定ip跨域

直接在Controller类或者方法上添加

@CrossOrigin
@Controller
public class BookController {
   
	//do something...
}

2、设置头部信息

首先要了解一下以下几个名词:

1、 CacheController(http协议的缓存控制),常见的值有:

  • no-cache:告诉浏览器、缓存服务器,不管本地副本是否过期,使用资源副本前,一定要到源服务器进行副本有效性校验。
  • must-revalidate:告诉浏览器、缓存服务器,本地副本过期前,可以使用本地副本;本地副本一旦过期,必须去源服务器进行有效性校验。
  • no-store:用于防止重要的信息被无意的发布,在请求消息中发送将使得请求和响应消息都不使用缓存。
  • 注意:仅适用于
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,我们可以使用CORS(Cross-Origin Resource Sharing)机制来解决跨域问题。CORS是一种机制,允许Web应用程序从不同的域访问其资源。下面是一种使用Spring框架实现CORS的方式: 1. 创建一个类来配置CORS: ``` @Configuration public class CorsConfig { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*"); } }; } } ``` 在上述代码中,我们使用了Spring的@Configuration注解来声明一个Java配置类,然后创建了一个名为CorsConfig的类。该类中我们使用了@Bean注解来声明一个名为corsConfigurer的方法,该方法返回一个WebMvcConfigurer对象。在该方法中,我们使用了WebMvcConfigurerAdapter类来扩展Spring MVC的配置,并重写了addCorsMappings()方法来配置CORS。我们使用了registry.addMapping()方法来配置允许跨域访问的URL和HTTP方法,这里我们设置了允许所有URL("**")和所有HTTP方法(GET、POST、PUT、DELETE、OPTIONS),同时也允许所有请求头。 2. 在Controller中使用@CrossOrigin注解: 我们也可以在Controller中直接使用@CrossOrigin注解来配置CORS,例如: ``` @RestController public class MyController { @CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE, RequestMethod.OPTIONS}) @GetMapping("/hello") public String hello() { return "Hello World!"; } } ``` 在上述代码中,我们使用了Spring的@RestController注解来声明一个RESTful Controller,并在其中使用了@GetMapping注解来声明一个GET请求的处理方法。在该方法中,我们使用了@CrossOrigin注解来配置CORS,允许所有域名("*")进行跨域访问。 需要注意的是,为了安全起见,应该尽量限制允许跨域访问的域名和方法,避免出现安全问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值