解决java前后端分离端口跨域问题

 

问题描述:

目前我了解的解决跨域的几种方式:手写过滤器,手写拦截器,jsonnp,注解方式,配置nginx反向代理,共五种解决方式。

1. 手写过滤器实现(我用的这种)
通过过滤器开放需要访问的接口(我用的这种,推荐)
(1)写一个过滤器:

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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


@Component
public class CrossFilter implements Filter {
private static Logger logger = LoggerFactory.getLogger(CrossFilter.class);

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
logger.debug("跨域请求进来了。。。");
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
httpServletRequest.getSession();
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Access-Control-Allow-Origin", "*");
httpResponse.setHeader("Access-Control-Allow-Methods", "*");
httpResponse.setHeader("Access-Control-Max-Age", "3600");
httpResponse.setHeader("Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Connection, User-Agent, Cookie");
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpResponse.setHeader("Content-type", "application/json");
httpResponse.setHeader("Cache-Control", "no-cache, must-revalidate");
chain.doFilter(request, httpResponse);
}
}
在web.xml中配置过滤器和需要过滤的接口

<!-- 添加过滤器过滤跨域请求 -->
<filter>
<filter-name>cors</filter-name>
<!-- 这里配置上面刚刚设置的java过滤器文件 -->
<filter-class>com.ninesword.utils.CrossFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<!-- 这里配置你需要进行跨域的接口,*代表jsForSdp当前路径下所子有路径 -->
<url-pattern>/jsForSdp/*</url-pattern>
</filter-mapping>
经过以上配置,已经可以成功跨域了,亲测有效哦。

2.使用spring拦截器解决跨域问题
这个方法,是一个大佬推荐的,我没有试过。这里推荐文章:[java-拦截器实现跨域支持](https://blog.csdn.net/zpf0918/article/details/52624813)

3.jsonnp实现(仅适用GET请求,不推荐)
网上各种针对jsonnp实现跨域的文章很多,但是这种,据说只对get请求有效,不推荐。我用的是原声js写的组件,jsonnp常见于jquery ajax中,所以,这里无法解决我的问题,还是说下它怎么实现的吧。
使用jsonnp还是很简单的,如果你用的是jquery的话就更好了。

$.ajax({
url: "你的url",
type: 'GET',
dataType: 'JSONP',//重点在这里,加上这个属性就可以跨域请求了
success: function (data) {
}
});
4.注解实现
我的框架是ssm。这里有注解可以解决跨域问题
springmvc @crossorigin跨域(注:需要Spring4.2以上版本)

5.配置nginx实现
利用nginx 反向代理解决跨域问题

https://www.cnblogs.com/mollie-x/p/10463140.html

(注:关于本方式本人专门写了一篇随笔,该方法可以完美解决跨域问题)

 

posted @ 2019-02-28 13:00  mollie_x  阅读(12272)  评论(0编辑  收藏  举报