Corsはドメインをまたぐ問題を解決します。


リソースが、そのリソース自体が存在するサーバとは異なるドメインまたはポートからリソースを要求すると、リソースは、ドメインをまたぐHTTP要求(下図ソースネットワーク)を開始する。セキュリティの観点から、ブラウザはドメインをまたぐ要求を制限またはブロックすることができます。このようなシーンは非常に多く、同時にドメインをまたぐ多くの解決方法を生み出しています。例えば私はhttp://localhost:8080上のajaxお願いしますhttp://localhost:9090上のサービスは下記の通りです。
jquery.min.js:4 Failed to load http://localhost:9090/testJsonp?format=json: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.
本論文はcors(ドメインをまたぐ資源の共有)技術を利用してajaxクロスドメイン問題を解決します。corsは、ターゲットサーバから返されたHeader設定によって、ドメインをまたぐことができるかどうかを制御するものである。その中の重要な一つのパラメータは Access-Coontrol-Allow-Origin(アクセス制御許可源)は、このパラメータで受信可能な要求リソースを指定します。実現上は、ブロックまたはフィルタを使っても良いです。
使用例


   corsFilter
   com.simonsfan.cn.filter.CorsFilter
   
      allowOrigin
      http://×××.com;
   
   
      allowMethods
      GET,POST,PUT,DELETE,OPTIONS
   
   
      allowCredentials
      true
   
   
      allowHeaders
      Content-Type
   


   corsFilter
   /*
     
上記のように、Web.xmlでは、corsによって使用されるいくつかの定数を定義しており、これらの定数は、直接、列挙または普通量以下のCorsFilterクラスに定義されてもよい。
allowOrigin:    (  +  +  );

allowMethods:Http    (get/post/put/delete/options);

allowCredentials:      cookie Http        (true/false);

allowHeaders:             (Content-Type);
カスタムフィルタCorsFilterクラス
public class CorsFilter implements Filter {
    private String allowOrigin;
    private String allowMethods;
    private String allowCredentials;
    private String allowHeaders;
    private String exposeHeaders;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        allowOrigin = filterConfig.getInitParameter("allowOrigin");
        allowMethods = filterConfig.getInitParameter("allowMethods");
        allowCredentials = filterConfig.getInitParameter("allowCredentials");
        allowHeaders = filterConfig.getInitParameter("allowHeaders");
        exposeHeaders = filterConfig.getInitParameter("exposeHeaders");
    }

    @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;
        if (!StringUtils.isEmpty(allowOrigin)) {
            List allowOriginList = Arrays.asList(allowOrigin.split(","));
            if (!CollectionUtils.isEmpty(allowOriginList)) {
                String currentOrigin = request.getHeader("Origin");
                if (allowOriginList.contains(currentOrigin)) {
                    response.setHeader("Access-Control-Allow-Origin", currentOrigin);
                }
            }
        }
        if (!StringUtils.isEmpty(allowMethods)) {
            response.setHeader("Access-Control-Allow-Methods", allowMethods);
        }
        if (!StringUtils.isEmpty(allowCredentials)) {
            response.setHeader("Access-Control-Allow-Credentials", allowCredentials);//      cookie http        
        }
        if (!StringUtils.isEmpty(allowHeaders)) {
            response.setHeader("Access-Control-Allow-Headers", allowHeaders);
        }
        if (!StringUtils.isEmpty(exposeHeaders)) {
            response.setHeader("Access-Control-Expose-Headers", exposeHeaders);
        }
        chain.doFilter(request, response);
   }
}
注意:上記のコードは、被呼加入者のサービスに記載されています。
Cors比較jsop
Corsはjsonpと同じ効果を実現できますが、jsonpよりは強いです。http要請はすべてのタイプに対応しています。jsopはget方式の要求だけをサポートしています。上記のコードは正常にajaxドメインを越えた問題を解決しました。