シーン:のの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(値)を返します。
}
}