javascript
  • redirect
  • greasemonkey
  • 2016-10-18 4 views 1 likes 
    1

    ログインしていないときに間違ったログインページにリダイレクトするサイトがあります。Greasemonkey発行のリダイレクトは、リダイレクトラインの後にalert()が呼び出された場合にのみ機能します

    <html> 
        <head> 
        <meta name="robots" content="noindex,nofollow"> 
        <script type="application/javascript"> 
         window.location.href = '/access/login?return_to=' + encodeURIComponent(window.location.href); 
        </script> 
        </head> 
    </html> 
    

    実際のページには、200 OKとLocation:ヘッダーがロードされています。 JavaScriptは間違ったページにリダイレクトするならば、正しいログインURLに私をオフに送信し、そこにある

    // ==UserScript== 
    // @name  Fix buggy login redirect 
    // @namespace [email protected] 
    // @description Fixes the buggy redirect that redirects to the wrong login page 
    // @include https://internal.domain/* 
    // @version 1 
    // @grant  none 
    // @run-at document-start 
    // ==/UserScript== 
    window.addEventListener('beforescriptexecute', function(e) { 
    if (document.getElementsByTagName("script")[0].text.trim() === "window.location.href = '/access/login?return_to=' + encodeURIComponent(window.location.href);") { 
    
    window.location.replace('https://example.com'); 
    alert(" "); 
    } 
    
    }, true); 
    

    私のスクリプトをチェック:

    は、この問題を解決するために、私はGreasemonkeyのpageload前に実行するスクリプトを構成しました。

    alert()がある場合、このスクリプトは正常に動作します。 alert()を削除すると、ページは壊れたログインページにリダイレクトされます。しかし、alert()の場合、警告ボックスは表示されませんが、になります。適切なページにリダイレクトされます。

    alert()は実行されていないようですが、削除してもらいたいページを目的のページにリダイレクトすることができます。

    この問題について私の質問:

    • はなぜこれが起こっていますか?タイミングに問題がありますか?
    • 役に立たなくても正しく動作させるにはどうすればいいですかalert()

    答えて

    2

    このコードには「競合条件」があります。 alert()が見つからない場合、古いJSは、location.replace();の仕上げの前にまだ起動します。
    警告は発砲するまでに時間がかかります。それが済むと、できるだけ早くlocation.replaceが終了します。

    正しいことは、スクリプトを停止してから置き換えを開始することです。 stopPropagationpreventDefaultでそれを行います。何かのように:

    window.addEventListener ('beforescriptexecute', function (e) { 
        if (document.getElementsByTagName ("script")[0].text.trim() 
         === "window.location.href = '/access/login?return_to=' + encodeURIComponent(window.location.href);" 
        ) { 
         e.stopPropagation(); 
         e.preventDefault(); 
         window.location.replace ('https://example.com'); 
        } 
    }, true); 
    
    +1

    ああ!!それはそれを説明する。それを試して、それはすばらしく動作します。私は以前にstopPropagationについて知っておらず、preventDefaultも知っていませんでした。あなたの時間をありがとう! –

    +0

    あなたは大歓迎です。喜んで助けてください。 –

    関連する問題