先后台分离致使的session跨域问题

 本身第一次写博客,但愿把工做中遇到的问题总结一下,和你们一块儿谈论、学习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丢失问题已经彻底解决,很差的地方还请多多指正!

相关文章
相关标签/搜索