strutsブロッキングajax非同期呼び出し異常問題(二)


前編で述べたフロントjsでstrutsブロッキングajax非同期呼び出し異常問題を解決できるほか、バックグラウンドでも同様に解決できる.
原理:ブロック時、オブジェクトの戻り値がStringかvoidかを判断します.voidであれば一般的に非同期呼び出し操作です.前編のように非同期呼び出しであるか否かを判断することも可能である.
まず、グローバルの戻り値を定義します.
struts.xml構成
   <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">http://test/login.action</result>
            <result name="illegal" type="redirect">http://test/illegal.action</result>
   </global-results>
illegal action定義を追加するには、次の手順に従います.
 <action name="illegal" method="illegal" class="com.action.login.LoginAction">
 </action>
バックグラウンドJAVA:
illegalメソッドの定義
   public void illegal(){
          response.setCharacterEncoding("UTF-8");
        try {
            response.setContentType("text/plain;charset=" + response.getCharacterEncoding());
            Writer writer = response.getWriter();
            writer.write("     ");
            writer.flush();
            writer.close();
        } catch (Exception e) {
            logger.error("error:", e);
        }
    }
ブロッキング:
   
  if(illegal){

                    if (isAjaxRequest(reuqeset)) {//        ,        
                         return "login";
                    } else {//       ,   json     
                        return "illegal";
                    }

}
    private boolean isAjaxRequest(HttpServletRequest request) {   
        String header = request.getHeader("X-Requested-With");   
        if (header != null && "XMLHttpRequest".equals(header))   
            return true;   
        else   
            return false;   
    }