小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

Cors解决Java开发时的跨域问题

# Java Web,java,ajax跨域问题 额外说明

收录于:17天前

同源与跨域

前后端分离就会出现跨域问题。不用在html语言中嵌入jsp、asp、ejr等,而是混入html中直接操作数据库、获取数据。这是一种前后端分离开发的模式。前后端的通信是基于Ajax技术的,这也是Javascript最重要的技术之一。

为了维护浏览器的安全,指定了同源政策也就是域名协议港口均相同的才能进行访问,当页面在执行一个脚本时会检查访问的资源是否同源,如果非同源,那么在请求数据时,就会被浏览器拦截。

然而,前端和后端单独开发时使用的软件可能不同,这可能会导致三者之间的不一致。 (最常见的是端口)

http://localhost:8080/index.html
http://locahost/user     //(默认80)
//端口不同
http://abc.com
http://abd.com/post/
//域名不同
http://abc.com
https://abc.com
//协议不同

跨域是指请求URL的协议、域名、端口有一个与当前页面URL不同,则为跨域。实现跨域访问的技术有很多,比如JSONP、flash、iframe、跨域资源共享(Cors)、nginx代理跨域、nodejs中间件代理跨域、WebSocket协议跨域等。

Cors解决跨域问题的原理

CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。
如图就是跨域导致请求不成功:
cors跨域
在这里插入图片描述
可以看到请求的网址端口收80,响应端口收8080(Origin)

  1. http请求头
    Origin: 普通的HTTP请求也会带有,在CORS中专门作为Origin信息供后端比对,表明来源域。
    Access-Control-Request-Method: 接下来请求的方法,例如PUT, DELETE等等
    Access-Control-Request-Headers: 自定义的头部,所有用setRequestHeader方法设置的头部都将会以逗号隔开的形式包含在这个头中。

  2. 请求头中访问控制请求方法表示请求的方法,例如PUT, DELETE等等
    **Access-Control-Request-Headers:**自定义的头部,所有用setRequestHeader方法设置的头部都将会以逗号隔开的形式包含在这个头中。

  3. http响应头
    响应也是通过http协议封装的,其中origin字段表明跨域请求的来源。然后服务器处理完请求之后,会再返回结果中加上如下控制字段。

  4. 访问控制允许来源: 允许跨域访问的域,可以是一个域的列表,也可以是通配符"*"。这里要注意Origin规则只对域名有效,并不会对子目录有效。即http://foo.example/subdir/ 是无效的。但是不同子域名需要分开设置,这里的规则可以参照同源策略
    访问控制允许凭证: 是否允许请求带有验证信息,
    访问控制公开标头: 允许脚本访问的响应头
    访问控制最大年龄: 缓存此次请求的秒数。在这个时间范围内,所有同类型的请求都将不再发送预检请求而是直接使用此次返回的头作为判断依据,非常有用,大幅优化请求次数
    访问控制允许方法: 允许使用的请求方法,以逗号隔开
    访问控制允许标头: 允许自定义的头部,以逗号隔开,大小写不敏感

JavaWeb解决跨域问题

根据CORS原理,只需添加Origin中允许访问的域名即可。

  1. 编写Filter修改Origin:
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//自定义
@WebFilter("/*")   //这里是注解,习惯web.xml配置的见下
public class allFilter implements Filter {
    
    public void init(FilterConfig config) throws ServletException {
    
    }

    public void destroy() {
    
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    
        HttpServletResponse res = (HttpServletResponse)response;
        res.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
        res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        res.setHeader("Access-Control-Max-Age", "3600");
        res.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        chain.doFilter(request, response);  //注意最后一定要放行
    }
}

核心:添加上允许访问的域名
```js
res.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
webxml配置
```java
<filter>
   <filter-name>CORSFilter</filter-name>    //过滤器名称
   <filter-class>com.grain.filter.CORSFilter</filter-class>  //过滤器所在项目路径
  </filter>
  <filter-mapping>
    <filter-name>CORSFilter</filter-name>
   <url-pattern>/*</url-pattern>     //允许那些域名访问  /* 表示所有
  </filter-mapping>

  1. web.xml配置文件解决跨域
    下载cors-filter-1.7.jar和java-property-utils-1.9.jar工具包然后在web.xml配置Filter文件,如下:
<filter>
		<filter-name>CORS</filter-name>
		<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
		<init-param>
			<param-name>cors.allowOrigin</param-name>
			<param-value>*</param-value>
		</init-param>
		<init-param>
			<param-name>cors.supportedMethods</param-name>
			<param-value>GET,POST,HEAD,PUT,DELETE</param-value>
		</init-param>
		<init-param>
			<param-name>cors.supportedHeaders</param-name>
			<param-value>Accept,Origin,X-Requested-With,Content-Type,Last-Modified</param-value>
		</init-param>
		<init-param>
			<param-name>cors.exposedHeaders</param-name>
			<param-value>Set-Cookie</param-value>
		</init-param>
		<init-param>
			<param-name>cors.supportsCredentials</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CORS</filter-name>
		<url-pattern>/*</url-pattern> </filter-mapping> 

它们都修改了 Origin 以允许跨域访问。

如果学习了Spring框架还会有更高级的方法,所以一起加油把!
科尔斯官方网站

其他的跨域问题@黛米讲的很全谢谢作者!

. . .

相关推荐

额外说明

原子安装插件

1.换源 http://blog.csdn.net/qianghaohao/article/details/52331432 2.手动安装 通过git将插件源码下载下来并放到 .atom/packages 目录下 https://atom-china.o

额外说明

Unity WebView 插件⭐️(四)插件不同平台版本的区别和注意事项

-前言 该文章是WebView 插件系列文章,传送门:浏览器插件3D WebView专栏 上一篇文章对3D WebView 插件的Demo示例场景做了一个简单的说明介绍 那本篇文章就来介绍下 该插件不同平台版本 之间的区别和注意事项 插件不同平台版本的区

额外说明

编辑器 统一修改 材质的shder

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.IO; /// /// 统一修改

额外说明

机器学习 第五节 第四课

[toc] 练习一 现在我们有一组关于全球星巴克店铺的统计数据, 如果我想知道美国的星巴克数量和中国的哪个多, 那么应该怎么办? 思路: 遍历一遍, 每次加 1? 执行结果: 分组和聚合 在 pandas 中类似的分组的操作我们有很简单的方式来完成. 调

额外说明

Python爬虫之Scrapy框架系列(4)——项目实战【某瓣Top250电影更多信息的获取】

前言: 上篇文章使用Scrapy框架简单爬取并下载了某瓣Top250首页的排名前25个电影的电影名。 太寒酸了,这篇文章咱就来仔细搞一搞,搞到更加详细的信息!!! 目录: 1.分析 2.使用scrapy shell提取电影详细信息 2.1 终端进入scr

额外说明

【Unity3D日常开发】修改游戏对象的材质颜色

推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一、前言 前段时间比较忙,好久没更新博客了,感觉技术都下降了,还是要坚持输出呀。 孔子曰:“学而不思则罔,思而不学则殆”,不能光学

额外说明

OpenCV实战(33)——OpenCV与深度学习的碰撞

OpenCV实战(33)——OpenCV与深度学习的碰撞 0. 前言 1. 深度学习和卷积神经网络 2. 使用深度学习进行人脸检测 2.1 SSD 简介 2.2 使用 SSD 执行人脸检测 3. 完整代码 小结 系列链接 0. 前言 深度学习是机器学习的

额外说明

构建超大规模的行人检测数据集

文章目录 摘要 从VOC2007数据集中获取行人类别 从VOC2012数据集中获取行人类别 从COCO数据集中获取行人类别 从DanceTrack数据集中获取行人类别 从WiderPerson数据集中获取行人类别 从CUHKSYSU数据集中获取行人类别

额外说明

CXF入门Exception in thread "main" java.lang.NoSuchMethodError

CXF入门Exception in thread "main" java.lang.NoSuchMethodError 找不到方法? 什么鬼? 原来猫腻在这里 <dependency>           <groupId>org.apache.cxf<

额外说明

【软考 系统架构设计师】嵌入式系统③ 嵌入式系统软件

>>回到总目录<< 为了不辜负已经订阅了专栏的同学们的信任,所以本专栏不会有任何的优惠活动。 另外,当订阅人数每次达到 2 n ( n > 2 ) 2^n(n>2) 2

ads via 小工具