Javaのマイクロサービス春のセキュリティは+のOAuth2フォーム認証に提出

シーン:ののOAuth2用いたマイクロ・サービス・システム  ベアラ道の認証を、提出からデータを認証することができない、リッチテキストエディタueditorは、Baiduのアップロード画像は401で、その結果、フォームの擬似AJAXを使用して提出されます

提出からヘッダーを設定することはできませんので

 

 

ソリューション:

1、ソースコードBaiduのリッチテキストエディタの変更ueditor.all.min.jsをする方法、追加のパラメータを呼び出すときに、アップロードの写真を

 

/ **
         *サーバーが提示する追加パラメータのリストを取得します。
         * @コマンドのserverparam
         * @method queryCommandValue
         * @Param {文字列} CMDコマンド文字列
         * @example
         * `` `ジャバスクリプト
         * Editor.queryCommandValue( 'serverparam'); //オブジェクトを返し{ 'キーを': '値'}
         * `` `
         * /
        'serverparam':{
          execCommand:関数(CMD、キー、値){
            (キー===未定義||キー===ヌルは){//パラメータをクリアリストを渡さない場合
              serverParam = {};
            }(utils.isString(キー))は{//キーを渡すそうであれば
              {(値=== ||値=== NULLを未定義)場合
                serverParam [キー]を削除します。
              }他{
                serverParam [キー] =値。
              }
            }エルス(utils.isObject(キー))であれば{//入ってくるオブジェクト、覆われたアイテムのリスト
              utils.extend(serverParam、キー、真の);
            }エルス(utils.isFunction(キー))であれば{//関数に渡され、リスト項目を追加
              utils.extend(serverParam、キー()、TRUE);
            }

          }、
          queryCommandValue:関数(){
            (もし!serverParam){
              serverParam = {};
            } 
        //ローカル変更 VAR accessToken = JSON.parse(window.sessionStorage.getItem( " pigx-access_tokenは"))コンテンツを.; アクセストークン=トークン|| ''; serverParam [ '_承認'] =トークン。 serverParam [ '_ドメイン'] = window.location.host。 console.log(serverParam) リターンserverParam || {}; } }

 

 2、doAjaxを変更する方法があります

関数doAjax(URL、ajaxOptions){
      XHR = creatAjaxRequestは()、でした
        //もしタイムアウト
        timeIsOut = falseを、
        //デフォルトパラメータ
        defaultAjaxOptions = {
          方法: "POST"、
          タイムアウト:5000、
          非同期:真、
          データ:覆われた場合にのみ、オブジェクトを渡す{} //必要
          ONSUCCESS:関数(){
          }、
          ONERROR:関数(){
          }
        }。

      IF(typeof演算URL === "オブジェクト"){
        ajaxOptions = URL;
        URL = ajaxOptions.url。
      }
      (!XHR || URL)であればリターン。
      VAR ajaxOpts = ajaxOptions?utils.extend(defaultAjaxOptions、ajaxOptions):defaultAjaxOptions。

      VAR submitStr = json2str(ajaxOpts)。// {名: "ジム"、市: "北京"}  - > "名前=ジム&都市=北京"
      ユーザが直接データパラメータの上にJSONオブジェクトを通過する場合、そのオブジェクトは、文字列のJSONにこれを変換する必要があります//
      (もし!utils.isEmptyObject(ajaxOpts.data)){
        submitStr + =(?submitStr "&": "")+ json2str(ajaxOpts.data)。
      }
      //タイムアウト検出
      VARれるtimerId = setTimeoutメソッド(関数(){
        (xhr.readyState!= 4)であれば{
          timeIsOutは真=。
          xhr.abort();
          clearTimeout(れるtimerId);
        }
      }、ajaxOpts.timeout)。

      VAR法= ajaxOpts.method.toUpperCase()。
      VAR STR = URL +(url.indexOf()== -1 "?"? "?": "&")+(メソッド== "POST" "?":submitStr + "&NOCACHE =" + +新しい日付) ;
      xhr.open(方法、STR、ajaxOpts.async)。
      xhr.onreadystatechange =関数(){
        IF(xhr.readyState == 4){
          (もし!timeIsOut && xhr.status == 200){
            ajaxOpts.onsuccess(XHR)。
          }他{
            ajaxOpts.onerror(XHR)。
          }
        }
      }; 
    //ローカル変更 VAR accessToken = JSON.parse(window.sessionStorage.getItem( " pigx-access_tokenは"))コンテンツを.; アクセストークン=トークン|| ''; xhr.setRequestHeader( '認可'、 'ベアラ' +トークン)。 xhr.setRequestHeader( 'X-DOMAIN'、window.location.host)。 IF(方法== "POST"){ xhr.setRequestHeader( 'コンテンツタイプ'、 'アプリケーション/ x-www-form-urlencodedで')。 xhr.send(submitStr)。 }他{ xhr.send(NULL)。 } }

 図3は、自動的にアップロード方法コピーした写真を修正します

/ **
   * @description
   *編集領域に1.ドラッグ&ドロップファイルは、自動的にアップロードされ、選挙に挿入します
   * 2.自動的に選挙にアップロードされ、挿入された画像ボードを貼り付け
   * @author Jinqn
   * @date 2013年10月14日
   * /
  UE.plugin.register( 'autoupload'、関数(){

    機能sendAndInsertFile(ファイル、編集者){
      それは私=エディタです。
      //アナログデータ
      VAR fieldNameに、urlPrefix、maxSizeの、allowFiles、actionUrl、
        loadingHtml、ErrorHandlerを、successHandler、
        ファイルタイプ= /image\/\w+/i.test(file.type)?'画像ファイル'、
        loadingId = 'loading_' +(+新しいDate())のtoString(36)。

      フィールド名= me.getOpt(ファイル形式+ 'フィールド名')。
      urlPrefix = me.getOpt(ファイル形式+ 'UrlPrefix')。
      maxSizeの= me.getOpt(ファイル形式+ 'のMaxSize')。
      allowFiles = me.getOpt(ファイル形式+ 'AllowFiles')。
      actionUrl = me.getActionUrl(me.getOpt(ファイル形式+ 'ACTIONNAME'));
      ErrorHandler =関数(タイトル){
        VARローダ= me.document.getElementById(loadingId)。
        ローダ&& domUtils.remove(ローダ)。
        me.fireEvent( 'showmessage'、{
          'ID':loadingId、
          「コンテンツ」:タイトル、
          「タイプ」:「エラー」、
          'タイムアウト':4000
        });
      }。

      IF(ファイルタイプ== '画像'){
        loadingHtml = '<IMGクラス= "loadingclass" ID = "' + loadingId + ' "SRC ="' +
          me.options.themePath + me.options.theme +
          '/images/spacer.gif "タイトル="' +(me.getLang( 'autoupload.loading')|| '')+ '」>';
        successHandler =関数(データ){
          VARリンク= urlPrefix + data.url、
            ローダ= me.document.getElementById(loadingId)。
          IF(ローダ){
            loader.setAttribute( 'SRC'、リンク)。
            loader.setAttribute( '_ SRC'、リンク)。
            loader.setAttribute( 'タイトル'、data.title || '');
            loader.setAttribute( 'ALT'、data.original || '');
            loader.removeAttribute( 'ID')。
            domUtils.removeClasses(ローダー、 'loadingclass');
          }
        }。
      }他{
        loadingHtml = '<P>' +
          '<IMGクラス= "loadingclass" ID = "' + loadingId + ' "SRC ="' +
          me.options.themePath + me.options.theme +
          '/images/spacer.gif "タイトル="' +(me.getLang( 'autoupload.loading')|| '')+ '」>' +
          '</ P>';
        successHandler =関数(データ){
          VARリンク= urlPrefix + data.url、
            ローダ= me.document.getElementById(loadingId)。

          VAR RNG = Menksilekshnkgetriadage()
            BK = rng.createBookmark()。
          rng.selectNode(ローダ).select();
          me.execCommand( 'insertfile' { 'URL':リンク})。
          rng.moveToBookmark(BK).select();
        }。
      }

      / * *ロードするためのプレースホルダを挿入/
      me.execCommand( 'inserthtml'、loadingHtml)。

      / * *バックエンド構成が正常にロードされないかどうかを決定/
      (もし!me.getOpt(ファイルタイプ+ 'ACTIONNAME')){
        ErrorHandler(me.getLang( 'autoupload.errorLoadConfig'));
        リターン;
      }
      / *ファイルサイズが上限を超えているかどうかを決定します* /
      IF(file.size> maxSizeの){
        ErrorHandler(me.getLang( 'autoupload.exceedSizeError'));
        リターン;
      }
      / *ファイル形式は許容*を超えているかどうか判断されます/
      VAR fileext = file.name?file.name.substr(file.name.lastIndexOf() ''): '';
      IF((fileext &&ファイルタイプ!= '映像')||(allowFiles &&(allowFiles.join( '')+ ' ')のindexOf(fileext.toLowerCase()+'。')== -1)){
        ErrorHandler(me.getLang( 'autoupload.exceedTypeError'));
        リターン;
      }

      / * *アヤックスを作成し、提出します/
      VaRのXHR =新しいXMLHttpRequestを()、
        FD =新しいいるFormData()、
        params = utils.serializeParam(me.queryCommandValue( 'serverparam'))|| ''、
        URL = utils.formatUrl(actionUrl +(actionUrl.indexOf()== -1 '?'? '?': '&')+のparams);

      fd.append(フィールド名、ファイル、file.name ||( 'ブロブ。' + file.type.substr( '画像/' の長さ))。)。
      fd.append( 'タイプ'、 'AJAX')。
      xhr.open( "ポスト"、URL、真の);
      VAR accessToken = JSON.parse(window.sessionStorage.getItem( "pigx-access_tokenは"))のコンテンツ。
      アクセストークン=トークン|| '';
      xhr.setRequestHeader( '認可'、 'ベアラ' +トークン)。
      xhr.setRequestHeader( 'X-DOMAIN'、window.location.host)。
      xhr.setRequestHeader( "X-要求-と"、 "XMLHttpRequestの");
      xhr.addEventListener( '負荷'、関数(E){
        {試します
          VAR JSON =(新機能( "リターン" + utils.trim(e.target.response)))();
          (json.state == 'SUCCESS' && json.url){もし
            successHandler(JSON)。
          }他{
            ErrorHandler(json.state)。
          }
        }キャッチ(S){
          ErrorHandler(me.getLang( 'autoupload.loadError'));
        }
      });
      xhr.send(FD)。
    }

  

 

図4に示すように、バックグラウンドで処理されたフィルタ、受信用の追加のパラメータ、

@オーバーライド
    公共ボイドのdoFilter(のServletRequest要求たServletResponse応答れるFilterChain鎖)にIOException、ServletExceptionがを{スロー
        // Baiduのエディタはセットヘッダ、そう、次のコードを変更することはできません画像にフォームの送信をアップロードするために使用します。
        もし(((HttpServletRequestの)要求).getRequestURI()。( "ueditorConfig")が含まれてい&& StringUtils.isNotBlank(request.getParameter( "_承認")))
        {
            HttpHeaderRequestWrapper httpHeaderRequestWrapper =新しいHttpHeaderRequestWrapper((HttpServletRequestを)要求
                    、request.getParameter( "_承認")
                    、request.getParameter( "_ドメイン"));
            //this.setDomain(httpHeaderRequestWrapper、(HttpServletResponseの)応答)。
            chain.doFilter(httpHeaderRequestWrapper、応答)。
        }
        他の{
            //this.setDomain((HttpServletRequest)request,(HttpServletResponse)response);
            chain.doFilter(リクエスト、レスポンス)。
        }
        リストアスレッド変数の値を完了するための//要求
        log.info(「復元スレッド変数値」)。
        //HostThreadLocalConstant.getDomian()セット( "")。
    }

  書き換え5、getHeaders 方法

プライベート静的クラスHttpHeaderRequestWrapperはHttpServletRequestWrapperクラス拡張{

        民間最終文字列のドメイン;
        民間最終文字列の承認;

        公共HttpHeaderRequestWrapper(HttpServletRequestのリクエスト、文字列の許可、文字列のドメイン){
            スーパー(リクエスト)。
            this.domain =ドメイン;
            this.authorization =「無記名」+認証。
        }

        @オーバーライド
        パブリック文字列のgetHeader(文字列名){
            もし(名前!= nullの&&
                    name.equals( "X-DOMAIN")&&
                    super.getHeader( "X-DOMAIN")== NULL){
                ドメインを返します。
            }それ以外の場合(名前!= nullの&&
                    name.equals( "認可")&&
                    super.getHeader( "許可")== NULL){
                承認を返します。
            }他{
                リターンsuper.getHeader(名);
            }
        }

        @オーバーライド
        パブリック列挙<ストリング> getHeaders(文字列名){
            一覧<文字列>の値= Collections.list(super.getHeaders(名));
            もし(名前!= nullの&& name.equals( "認可")){
                values.add(承認)。
            }
            Collections.enumeration(値)を返します。
        }


    }

  

 

おすすめ

転載: www.cnblogs.com/forthelichking/p/11857843.html