Java教程

Java Spring项目中的CORS跨域开启的几种方式

本文主要是介绍Java Spring项目中的CORS跨域开启的几种方式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在服务器端开启跨域的原理,一般都是通过在HTTP Headers中的响应头的Access-Control-Allow-Origin指定放行的域,来完成的。
Access-Control-Allow-Origin响应头指定了该响应的资源是否被允许与给定的域(origin)共享。
跨域出错,一般在浏览中会有:
'http://xxxxx' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

要开启全局跨域也有很多的方式,如下:

一.添加filter开启

可以在添加filter指定共享的域
filter类

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CrossOriginFilter implements Filter {
    private FilterConfig config = null;

    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

    @Override
    public void destroy() {
        this.config = null;
    }

    /**
     * @comment 跨域的设置
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        // 表明它允许"http://xxx"发起跨域请求
        httpResponse.setHeader("Access-Control-Allow-Origin",
                config.getInitParameter("AccessControlAllowOrigin"));
        // 表明在xxx秒内,不需要再发送预检验请求,可以缓存该结果
        httpResponse.setHeader("Access-Control-Allow-Methods",
                config.getInitParameter("AccessControlAllowMethods"));
        // 表明它允许xxx的外域请求
        httpResponse.setHeader("Access-Control-Max-Age",
                config.getInitParameter("AccessControlMaxAge"));
        // 表明它允许跨域请求包含xxx头
        httpResponse.setHeader("Access-Control-Allow-Headers",
                config.getInitParameter("AccessControlAllowHeaders"));
        chain.doFilter(request, response);
    }
}

web.xml的配置中

<!--  CORS过滤器-->
  <filter>
    <filter-name>CrossOrigin</filter-name>
    <filter-class>cn.mashirodever.blog.filter.CrossOriginFilter</filter-class>
    <init-param>
      <param-name>AccessControlAllowOrigin</param-name>
      <param-value>*</param-value>
    </init-param>
    <init-param>
      <param-name>AccessControlAllowMethods</param-name>
      <param-value>HEAD,POST,GET,DELETE,PUT</param-value>
    </init-param>
    <init-param>
      <param-name>AccessControlMaxAge</param-name>
      <param-value>3628800</param-value>
    </init-param>
    <init-param>
      <param-name>AccessControlAllowHeaders</param-name>
      <param-value>x-requested-with</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CrossOrigin</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

二.SpringMVC中配置开启

这种方法在spring项目中支持性会比filter好些,有时用filter不行的可尝试切换到这种。有一次就是filter中配置了允许的请求方法,但是只有get能跨域,post请求就一直报cors错误。换到这种就好了

这篇关于Java Spring项目中的CORS跨域开启的几种方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!