如何解决 java web项目跨域问题 ?

1.http请求头html

Origin: 普通的HTTP请求也会带有,在CORS中专门做为Origin信息供后端比对,代表来源域。java

Access-Control-Request-Method: 接下来请求的方法,例如PUT, DELETE等等nginx

Access-Control-Request-Headers: 自定义的头部,全部用setRequestHeader方法设置的头部都将会以逗号隔开的形式包含在这个头中web

 

2.http响应头ajax

而后浏览器再根据服务器的返回值判断是否发送非简单请求。简单请求前面讲过是直接发送,只是多加一个origin字段代表跨域请求的来源。而后服务器处理完请求以后,会再返回结果中加上以下控制字段后端

Access-Control-Allow-Origin: 容许跨域访问的域,能够是一个域的列表,也能够是通配符"*"。这里要注意Origin规则只对域名有效,并不会对子目录有效。即http://foo.example/subdir/ 是无效的。可是不一样子域名须要分开设置,这里的规则能够参照同源策略跨域

Access-Control-Allow-Credentials: 是否容许请求带有验证信息,浏览器

Access-Control-Expose-Headers: 容许脚本访问的返回头,请求成功后,脚本能够在缓存

Access-Control-Max-Age: 缓存这次请求的秒数。在这个时间范围内,全部同类型的请求都将再也不发送预检请求而是直接使用这次返回的头做为判断依据,很是有用,大幅优化请求次数tomcat

Access-Control-Allow-Methods: 容许使用的请求方法,以逗号隔开

Access-Control-Allow-Headers: 容许自定义的头部,以逗号隔开,大小写不敏感

 

若是程序猿偷懒将Access-Control-Allow-Origin设置为:Access-Control-Allow-Origin: * 容许任何来自任意域的跨域请求,那么久存在被 DDoS攻击的可能。

 

实现方式:

一、nginx配置文件配置:

server {  

    location / {  

        if ($request_method = 'OPTIONS') {  

          add_header 'Access-Control-Allow-Origin' '*';  

          add_header 'Access-Control-Allow-Credentials' 'true';  

          add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  

          add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';  

         # add_header 'Access-Control-Max-Age' 3600;  

          add_header 'Content-Type' 'text/plain charset=UTF-8';  

          add_header 'Content-Length' 0;  

          return 200;  

        }  

}

方法2:直接在tomcat安装目录下的lib中添加cors-filter-1.7.jar,java-property-utils-1.9.jar 这2个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>

方法3:本身写的  filter类,本身在在业务项目中配置web.xml 中配置想要的xml 文件。

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;

public class CrossFilter implements Filter {

	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		HttpServletResponse res = (HttpServletResponse) response;

//		res.setContentType("text/html;charset=UTF-8");
		
//		Access-Control-Allow-Origin 为容许哪些Origin发起跨域请求. 这里设置为”*”表示容许全部,一般设置为全部并不安全,最好指定一下
		res.setHeader("Access-Control-Allow-Origin", "*");

//		Access-Control-Allow-Methods 为容许请求的方法.
		res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");

//		Access-Control-Max-Age 代表在多少毫秒内,不须要再发送预检验请求,能够缓存该结果
		res.setHeader("Access-Control-Max-Age", "0");

//		Access-Control-Allow-Headers 代表它容许跨域请求包含content-type头,这里设置的x-requested-with ,表示ajax请求
		res.setHeader("Access-Control-Allow-Headers",
				"Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");

		res.setHeader("Access-Control-Allow-Credentials", "true");

		res.setHeader("XDomainRequestAllowed", "1");

		chain.doFilter(request, response);
	}

	public void init(FilterConfig arg0) throws ServletException {

	}

}
相关文章
相关标签/搜索