前後端分離項目にNo'Access-Coontrol-Origin'headerのドメイン横断問題が発生しました.

8361 ワード

さすが、踏んだだけの天才です.多く話をしないで食事をします.
穴を踏む
何の坑ですか
問題のロジックは大体
  • フロントエンドアクセスインターフェース
  • 傍受要求情報を検証し、tokenが失敗したときに、カスタマイズ異常をスローします.
  • バックエンド異常ブロック捕獲異常、一意コードを返し、ログインタイムアウトを促す
  • フロントエンドにはこの問題があります.
  • Access to XMLHttpRequest at 'http://ip1:port1/method' from origin
     'http://ip2' has been blocked by CORS policy:
     No 'Access-Control-Allow-Origin' header is present on the request resource
    
  • postmanやswwagerなどで直接tokenアクセスインターフェースを追加してデータ
  • を得ることができます.
  • 、かつ、tokenが正常な時に異常がなければ、クロスドメイン
  • を捨てることができない.
    ピットに登る
    一つの前後端分離項目は、必然的にクロスドメインに関わる.
    国境をまたぐ
    まず簡単に説明してください.
    これは、同じソースポリシーを提示する必要があります.簡単に言えば、異なるソースのリソースが相互作用するのを阻止することで、プロジェクトのセキュリティを効果的に向上させることができます.
    同源はprotocol、port host、つまり / / の3つの条件が同じであると同源と見なされます.そうでないとドメインをまたぐ問題が発生します.
    設定
    大体の解決方法は以下の通りです.
    1.先端配置jsop
    2.先端配置cors
    3.インバースエージェント
    4.バックエンドにコークスを設定する
  • は、フィルタに
  • を配置する.
  • は、スクリーンショットに
  • を配置する.
    プロジェクトで使ったスクリーンショットの構成を確認してください.cors.
        /**
         *     
         * @param registry
         */
        @Override
        public void addCorsMappings(CorsRegistry registry) {
         
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedHeaders("*")
                    .allowCredentials(true)
                    .allowedMethods("GET","POST","DELETE","PUT","PATCH","OPTIONS")
                    .maxAge(3600);
        }
    
    ブロックtokenチェックは大体コードをシミュレートします.前后端分离项目出现No ‘Access-Control-Allow-Origin‘ header 跨域问题_第1张图片に次いでグローバル異常ブロックがあり、ログインタイムアウトかどうかを区別します.
    解決策
    バックグラウンドのクロスドメイン設定が追加されていますが、フロントエンドはこの要求ヘッダに異常を報告しています.
    そこで各種の検査・調整に加えて、資料を調べると、一応はブロックがpreHandleの方法で例外を投げた後、この要求は完全な流れが終わっていないので、要求ヘッドのクロスドメイン構成が追加されていない.これもブロックを使ってクロスドメイン構成を実現する弊害であると推定される.
    フィルタを使ってクロスドメインの設定を追加します.
    照会した資料の中で、この中の方式はこのドメインをまたぐ問題を免れることができて、比較的に推薦する方式です.
    要求ヘッダを追加
    これは簡単で乱暴な方法です.私が採用した方法です.要請がドメインをまたぐ要求ヘッドを欠けている以上、私達は追加します.
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
         
            System.out.println("-----------preHandle-----------");
    
            String token = request.getHeader("token");
            if(StringUtils.isEmpty(token)){
         
                response.setHeader("Access-Control-Allow-Origin", "*");
                response.setHeader("Access-Control-Allow-Methods", "*");
                response.setHeader("Access-Control-Allow-Headers", "*");
                response.setHeader("Access-Control-Max-Age","3600");    //        
                response.setHeader("Access-Control-Allow-Credentials", "true"); //     Cookie
    
               throw new LoginTimeoutException("    !");
            }
            return true;
        }