spring 支持跨域 代码demo

其他技术

2017-12-27

38

0

技术:spring mvc 跨域

运行环境:spring mvc+ win7

demo功能:提供一个spring mvc支持跨域请求

app使用h5开发跨域运行过程

1.js发出请求, 请求app嵌入的浏览器

2.嵌入浏览器访问真正的服务。

(在访问前, 会先发一个option请求, 询问真正的服务是否支持跨域。 如果支持, 就再次请求。 服务端在收到询问请求时,

告诉浏览器支持, 并且告诉浏览器在跨域请求可以在多久中是有效的, 不用再次发送询问请求, 而是直接访问)

3. 所以对于js而言, 就是跨域了。

spring mvc实现

在拦截器中添加支持

如果是询问请求, 返回204, 允许

allowCSRFRequest(request, response);
if (RequestMethod.OPTIONS.name().equalsIgnoreCase(request.getMethod())) {
    response.setStatus(HttpStatus.NO_CONTENT.value());
    return false;
}

 

if (response.getStatus() != 302) {
    String allowOriginConfig = "null|http://localhost";
    String[] allowOrigins = allowOriginConfig.split("\\|");
    String requestOrigin = request.getHeader("Origin");
    if (org.apache.commons.lang.StringUtils.isEmpty(requestOrigin)) {
        requestOrigin = "null";
    }

    if (allowOrigins == null || allowOrigins.length == 0) {
        response.addHeader("Access-Control-Allow-Origin", "*");
    } else if (Arrays.asList(allowOrigins).contains(requestOrigin)) {
        response.addHeader("Access-Control-Allow-Origin", requestOrigin);
    } else {
        response.addHeader("Access-Control-Allow-Origin", Arrays.asList(allowOrigins).get(allowOrigins.length - 1));
    }

    response.addHeader("Vary", "Accept-Encoding");
    response.addHeader("Access-Control-Allow-Credentials", "true");
    response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    response.addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
    response.addHeader("Access-Control-Expose-Headers", "Content-encoding, Vary");
    response.addHeader("Access-Control-Max-Age", "60"); //单位, 秒,在这么多秒内,不用再次询问是否支持跨域
}

 

拦截器部分截图

 
 

欢迎添加微信,互相学习↑↑↑ -_-

发表评论

全部评论:0条

白老虎

programming is not only to solve problems, ways to think