標籤:ajax 攔截器
做項目的時候遇到了一個問題 當ajax發起action時觸發攔截器時返回值在攔截其中就更沒有接收到一樣不會發起跳轉 , 而用pos表單t提交的時候是可以的
糾結了很久現在找到了一個方法, 感覺不是很科學 , 能實現 希望哪位好心人看到過後能給下高手的解決辦法
可行的解決辦法如下:
struts2 配置如下:
<span style="font-size:12px;"><span style="color:#ff0000;"> </span><span style="color:#330033;"> <package name="register" namespace="/" extends="json-default"><interceptors><interceptor name="methodInterceptor" class="nwsuaf.intercept.MethodInterceptor" /><interceptor-stack name="register"><interceptor-ref name="defaultStack" /><!--調用自訂攔截器 --><interceptor-ref name="methodInterceptor" /></interceptor-stack></interceptors><default-interceptor-ref name="register" /><global-results><result name="nologin" type="json"><param name="includeProperties">nologin</param></result></global-results></span></span>
<span style="font-size:12px;color:#330033;"> </package></span>
<span style="font-size:12px;color:#330033;"> <package name="defaulddd" namespace="/" extends="register"> //注意這裡是繼承了上面的包名<action name="insertfocus" class="nwsuaf.action.systemService.FocusAction"method="insert"><result name="insertfocus" type="json"><param name="includeProperties">message</param></result></action></package></span>
JS代碼如下:
<span style="font-size:14px;"><span style="color:#330033;">function focusInsert(detailid,liketype){var uid = document.getElementById("idaaa").value;//alert(uid); if(confirm("確認關注此條資訊?")){ $.post("insertfocus.action", //下面參數的名稱自己可以改 {"mfocus.uid":uid,"mfocus.detailid":detailid,"mfocus.liketype":liketype}, function(result){ if(result == null){ alert('系統錯誤'); return false; }else if(result.nologin){ alert("您尚未登入,請登入後繼續操作..."); } else { alert("關注成功"); location.reload(); } }, 'json' ); }}</span><span style="color:#ff6600;"></span></span>
攔截器的.java類如下:
<span style="font-size:14px;color:#330033;">package nwsuaf.intercept; import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;import nwsuaf.bean.LoginBean;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MethodInterceptor extends AbstractInterceptor { /** * 攔截器 */private static final long serialVersionUID = 1L; @Overridepublic String intercept(ActionInvocation invocation) throws Exception {// TODO Auto-generated method stubSystem.out.println("攔截器起作用了!"); LoginBean u=(LoginBean) ActionContext.getContext().getSession().get("loginedUser"); if(u!=null){ System.out.println("攔截器u!=null:::"+u); return invocation.invoke(); } System.out.println("攔截器u=null:::"+u); // HttpServletResponse response = ServletActionContext.getResponse(); //response.getWriter().println("{\"nolgoin\":true}"); return "nologin";} } </span>
action類如下:
<span style="font-size:14px;color:#330033;">public class FocusAction extends BaseAction { </span>
<span style="font-size:14px;color:#330033;"> //action中的方法其實不用改,只需要給添加一個標誌欄位就好 注意一定要有set方法private boolean nologin=true;</span>
全域的攔截器:
<span style="font-size:14px;color:#330033;"><package name="myPackage" namespace="/" extends="struts-default"><interceptors><interceptor name="LoginInterceptor"class="biz.cld.framework.interceptor.LoginInterceptor" /><interceptor-stack name="myStack"><interceptor-ref name="defaultStack" /><!--調用自訂攔截器 --><interceptor-ref name="LoginInterceptor" /></interceptor-stack></interceptors><default-interceptor-ref name="myStack" /><global-results><result name="login">/EC/user/userLogin.jsp</result> </span><span style="font-size:14px;color:#ff0000;">//這裡和上面是由區別的 所有需要實現攔截器的只需要繼承“myPackage”這個包就可以了</span><span style="font-size:14px;color:#330033;"></global-results></package></span>
<span style="color:#330033;">public class LoginInterceptor extends AbstractInterceptor{@Overridepublic String intercept(ActionInvocation arg0) throws Exception {Map session=arg0.getInvocationContext().getSession();User user=(User)session.get("user");System.out.println(user);if(user!=null){return arg0.invoke();}elsereturn Action.LOGIN;}</span><span style="color:#ff0000;">}</span>
以上就是這些了 , 問題是決解了 , 但是覺得不是很滿意 ,希望有人分享經驗