strutsブロッキングajax非同期呼び出し失敗問題
<global-results>
<result name="exception">/WEB-INF/vm/error.vm</result>
<result name="error">/WEB-INF/vm/error.vm</result>
<result name="login" type="redirect">${ting.login.url}</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="exception"/>
</global-exception-mappings>
<package name="admin" extends="erp-base">
<interceptors>
<interceptor name="HrmPrivilegeInterceptor" class="action.common.interceptor.HrmPrivilegeInterceptor"/>
<interceptor-stack name="SecurityInterceptor">
<interceptor-ref name="strutsDefaultStack"/>
<!-- -->
<interceptor-ref name="HrmPrivilegeInterceptor"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="SecurityInterceptor"/>
</package>
プロジェクトではStruts 2+Extjs(混在するJquery)のアーキテクチャを用いて開発され、フロントバックグラウンド間のデータ転送はすべてJSON形式で行われているが、フロントのあるaction呼び出しでセッションが空になったり権限が足りなかったりした場合はページジャンプが必要であり、ajaxを採用する場合はフロントがジャンプページまでのhtmlのコードを取得するだけで、このようにフロントは直接システム異常を報告し,本格的なジャンプを実現することはできないが,この場合はフロントエンドページでJS制御を行う必要があり,ページジャンプを行うことができる.
strutsはグローバルブロックを構成する:
<global-results>
<result name="exception">/WEB-INF/vm/error.vm</result>
<result name="error">/WEB-INF/vm/error.vm</result>
<result name="login" type="redirect">${ting.login.url}</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="exception"/>
</global-exception-mappings>
<package name="admin" extends="erp-base">
<interceptors>
<interceptor name="HrmPrivilegeInterceptor" class="action.common.interceptor.HrmPrivilegeInterceptor"/>
<interceptor-stack name="SecurityInterceptor">
<interceptor-ref name="strutsDefaultStack"/>
<!-- -->
<interceptor-ref name="HrmPrivilegeInterceptor"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="SecurityInterceptor"/>
</package>
バックグラウンドブロック:
非同期呼び出しStrutsメソッドの戻り値はvoidで、残りはstringです.
if(isAjaxRequest(request)) {//
return "login";
}else{
response.sendError(403);
return "success";
}
または、非同期呼び出しであるかどうかを判断する方法を呼び出します.
private boolean isAjaxRequest(HttpServletRequest request) {
String header = request.getHeader("X-Requested-With");
if (header != null && "XMLHttpRequest".equals(header))
return true;
else
return false;
}
フロントjs:
$.ajaxSetup({"error":illegal});
function illegal(XMLHttpRequest, textStatus, errorThrown)
{
if(XMLHttpRequest.status==403){
window.location = "common/nopermit.html";
}else if(XMLHttpRequest.status==500){
window.location = "common/error.html";
}else ifif(XMLHttpRequest.status==408){
window.location = "login.html";
}
}
ここでajaxグローバル「エラーコール」設定を設定し、jqueryがバックグラウンドに渡されたerror情報を取得すると、自動的にページのジャンプが行われます.これでajaxの下のページジャンプが実現できます.
tingcommon.ajaxInvoke = function (url, datajson, type) {
jQuery.ajax({
type:type,
url:url,
data:datajson,
dataType:"json",
success:function (result) {
if (result.flag == true) {
res = true;
} else {
alert(result.message);
}
}// , error , error 。
});
};