博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring mvc+Ajax跨域请求-CORS方式
阅读量:5776 次
发布时间:2019-06-18

本文共 2608 字,大约阅读时间需要 8 分钟。

hot3.png

关于跨域问题,主要用的比较多的是cros跨域和JSONP跨域,JSONP跨域我已经在另外一篇博客中写了,这里主要说的是CORS方式的跨域。

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

基本思路就是在每个http请求的时候添加一些附加的头信息,如:Origin:http://172.18.2.222:8080,Origin字段指的是访问来源,服务器根据这个值,决定是否同意这次请求。如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。(我就在这个地方卡住了,服务器正常返回了数据,但是success回调函数一直捕获不到,总是被error函数捕获。之前一直都不知道有CORS的跨域方式,一直在使用JSONP的方式!!!)    服务器只要指定回应头的:Access-Control-Allow-Origin,就能实现跨域了,这个Access-Control-Allow-Origin的参数设置为Origin的源就可以了。相比JSONP方式,CROS的跨域前端页面和后台不需要做出任何更改。

那么,如何设置服务器的响应头呢?

下面上代码:

package com.fh.plugins.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Component;@Componentpublic class MyCORSFilter implements Filter {	 @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        HttpServletResponse response = (HttpServletResponse) servletResponse;        String origin = (String) servletRequest.getRemoteHost()+":"+servletRequest.getRemotePort();        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,Authorization");        response.setHeader("Access-Control-Allow-Credentials","true");        filterChain.doFilter(servletRequest, servletResponse);    }    @Override    public void destroy() {    }}

定义一个过滤器,为所有的http请求都加上Access-Control-Allow-Origin的头。

web.xml的配置:

cors
com.fh.plugins.filter.MyCORSFilter
cors
/*

前端页面直接使用Ajax请求即可:

$.ajax({		  	url:URL+"h5Logs/getIMEI.do",		  	type:"get",			success:function(data){				//alert(data);				var imei_modes = data.split(";");				setCookie("IMEI",imei_modes[1],"d30");				setCookie("user_model",imei_modes[0],"d30");				setCookie("operators",imei_modes[2],"d30");	         			}		});

对于只知道JSONP的跨域方式的同学来说(就是我...), CROS跨域简直太美妙了!!!

参考博客:

转载于:https://my.oschina.net/hehongbo/blog/779802

你可能感兴趣的文章
一次Mutex死锁的原因探究
查看>>
flask的文件上传和下载
查看>>
如何查看java class文件的jdk版本
查看>>
ImportError: cannot import name UnrewindableBodyError
查看>>
翻翻git之---有用的欢迎页开源库 AppIntro
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>
PHP-Windows下搭建PHP-MSF环境【原创】
查看>>
linux-友好显示文件大小
查看>>
emplace_back() 和 push_back 的区别(转)
查看>>
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
查看>>
ASP、Access、80040e14、保留关键字、INSERT INTO 语句的语法错误
查看>>
【转】二叉树的非递归遍历
查看>>
NYOJ283对称排序
查看>>
接连遇到大牛
查看>>
[Cocos2d-x For WP8]矩形碰撞检测
查看>>
自己写spring boot starter
查看>>
花钱删不完负面消息
查看>>
JBPM之JPdl小叙
查看>>