本身第一次写博客,但愿把工做中遇到的问题总结一下,和你们一块儿谈论、学习java
如今项目作得是一个定制家具的供应链管理系统,咱们是先后台分离的工做模式(前台angularjs,后台java-ssm框架),先后台分离面临的第一个问题就是跨域问题。jquery
跨域问题通常有两种常见的解决方式,一是jsonp,二是服务器端配置cors策略,二者相比cors更强大,jsonp只支持get请求,cors支持全部类型的http请求,jsonp的优点在于支持老式浏览器,以及能够向不支持cors的网站请求数据。angularjs
在项目中我采用的是配置cors,具体作法:建立实体类ScmcCors实现Filter接口,代码以下web
@Component
public class ScmcCors implements Filter{ajax
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}json
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-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");
chain.doFilter(req, res);跨域
}浏览器
@Override
public void destroy() {
// TODO Auto-generated method stub
}服务器
}cookie
在web.xml文件添加配置
<filter>
<filter-name>cors</filter-name>
<filter-class>com.wishome.controller.ScmcCors</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
好了,到此跨域问题已经解决,但在项目进行的过程当中遇到了新的问题—session丢失,在网上找了很久总算是知道缘由了,原来默认的状况下,cors作到跨域以后是没有供应凭证(cookie、HTTP认证及客户端SSL证明等)。咱们可使用ajax配置项 withCredentials来解决这个问题:
jquery的ajax:
$.ajax({
xhrFields: {
withCredentials: true // 要在这里设置
},
url: "",
type:"post",
data:set,
dataType:"json",
success:function(data){
},error:function(){
}
});
angularjs咱们能够在$http这样配置:
angular.module('myApp').config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.withCredentials = true;
}])
配置结束以后,须要更改后台的ScmcCors实体类:
//修改doFilter方法
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "http://abc.com");//将*改成请求域的域名,必须加http
response.setHeader("Access-Control-Allow-Credentials", "true");//新增credentials设置
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");
chain.doFilter(req, res);
}
如今,跨域问题,以及跨域带来的session丢失问题已经彻底解决,很差的地方还请多多指正!