问题描述:后台使用ssm,前端angularJS,最近在开发过程中开始尝试前后端分离的开发模式,意外的是前端html在发送ajax请求到我的服务器时,出现了跨域问题,请求发送不成功!
解决:查看了大量的文章,没有什么完全类似的问题,综合一下,在项目中创建一个过滤器,在过滤器中设置HTTP头信息,设置允许跨域,然后在web.xml配置文件中配置该过滤器
过滤器代码:
package cn.com.qxev.filter;
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;
/**
* @ClassName: CorsFilter
* @Description: 解决跨域问题
* @author Shw
* @date 2018年4月3日
*/
public class CorsFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setContentType("textml;charset=UTF-8");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "0");
response.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");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("XDomainRequestAllowed","1");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
web.xml配置:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>cn.com.qxev.filter.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:
前端ajax中要加入withCredentials = true; 这个属性,跨域XHRHTTPRequest请求,浏览器是不会发送身份凭证信息的,改属性配合之前我们设置的response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));这个属性就可以做到浏览器发送身份凭证信息,服务器接收的目的。
但是!!!!前端同事加入了这个配置之后并没有什么卵用,跨域是没有问题了,但是sessionId还是不一致!!!
于是,同事修改了前端代码,不在ajax中加入这条属性,在js的全局配置中加入
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.withCredentials = true;
}]);
至此,sessionId才保持一致,至于为什么局部配置没效果,这个我也没弄清楚,可能是写的方式不对吧,前端我也不是很懂,大家有类似的问题可以参考一下。