zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java + Ajax跨域解决方案整理

2023-06-13 09:11:01 时间

大家好,又见面了,我是你们的朋友全栈君。

为什么会跨域呢?简单来说就是前端页面与后台服务没有部署在同一个服务器上。

产生跨域的情况有:

1.域名不同,端口也不同;

2.域名相同但是端口不同;

3.域名不同,端口相同。

解决方案:

一、JSONP方式

1.只支持get方法,不支持postfang方法;

使用时需修改前端和后端代码,用起来也不太方便,本文不推荐使用。

二、使用springMVC架构的,使用版本4.2以上

可以使用@CorsOrigin注解,可以放在方法上,也可以放在类名上

三、使用filter

该方法也参考了spring跨域的实现

public class PostFilter implements Filter {

	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {

		HttpServletResponse response = (HttpServletResponse) resp;
		response.setHeader("Access-Control-Allow-Origin",
				((HttpServletRequest) req).getHeader("Origin"));
		response.setHeader("Access-Control-Allow-Methods",
				"POST,GET,OPTIONS,DELETE");
		response.setHeader("Access-Control-Max-Age", "3600");
		response.setHeader("Access-Control-Allow-Headers",
				"Origin, X-Requested-With, Content-Type, Accept");
		response.setHeader("Access-Control-Allow-Credentials", "true");
		chain.doFilter(req, resp);

	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO 自动生成方法存根

	}

}

web.xml配置加入

        <filter>
		<filter-name>action</filter-name>
		<filter-class>com.filter.PostFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>action</filter-name>
		<url-pattern>*</url-pattern>
	</filter-mapping> 

前端ajax

	$.ajax({
		type:"post",
		url:url,
		data:jsonstr,
		dataType:"json",
        xhrFields: {
            withCredentials: true
        },
        crossDomain: true,
		success: function(msg){
		
		    },
		error:function(XMLHttpRequest, textStatus, errorThrown){
		   var readystate=XMLHttpRequest.readyState;
		    console.log('readystate:'+readystate+'textStatus:'+textStatus);
		       if(readystate==4)
			   readystate='该帐号已被他人登录';
			   else readystate='请检查网络';
			$('#label1').text(readystate);	
			$.mobile.hidePageLoadingMsg(); 
			},
		complete:function(XHR, TS){XHR = null;}
		});

以上便是我用过的方法

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172568.html原文链接:https://javaforall.cn