問題描述:
目前我了解的解決跨域的幾種方式:手寫過濾器,手寫攔截器,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
(注:關於本方式本人專門寫了一篇隨筆,該方法可以完美解決跨域問題)