ajax發起action時觸發攔截器,ajax發起action攔截
做項目的時候遇到了一個問題 當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>
以上就是這些了 , 問題是決解了 , 但是覺得不是很滿意 ,希望有人分享經驗
struts2 許可權 攔截器 JSON
首先 你得確定 你這個 ajax 請求的地址 是否 需要 身份認證 ,如果 不需要那簡單了 ,將你請求的 這個action 不要添加 許可權攔截器!
如果需要認證 , 那麼當被許可權攔截器 攔截的時候 你可以讓你的 攔截器 去返回一個 狀態標識(返回 json格式的 用一個 json-lib.jar) 如 :invalidSession=true
-- 這是 我做的項目的 攔截器 給你參考下
public String intercept(ActionInvocation invocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
if (isSessionValid(session)) {
return invocation.invoke();
}else{
//ajax request
if (request.getHeader("x-requested-with") != null
&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding(Constant.URI_ENCODE);
response.setContentType("application/json;charset=UTF-8");
PrintWriter out = response.getWriter();
JSONObject result = new JSONObject();
result.put("invalidSession", true);
result.put("redirectUrl", request.getContextPath() + LOGIN_URL);
out.print(result);
out.flush();
//basic request
} else {
ServletActionContext.getResponse().sendRedirect(request.getContextPath()+ "/common/customLogin&......餘下全文>>
Strut2怎給所有的action配攔截器
我舉個例子吧
struts2建立全域的攔截器struts2
主要是過濾沒有登陸的使用者,訪問其它的ACTION
<1>建立SessionInterceptor 實現 Interceptor
public class SessionInterceptor implements Interceptor {
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
Map session=ActionContext.getContext().getSession();
if(session.get("user")==null||"".equals(session.get("user"))){
System.out.println("發現沒有登陸,返回到首頁面");
return "input";
}
System.out.println("====================我定義的攔截器=========================");
String result=invocation.invoke();
System.out.println("====================我定義的攔截器=========================");
return result;
}
}
<2>struts2.xml配置
<package name="struts-shop" extends="struts-default">
<interceptors>
<interceptor name="sessionInterceptor" class="com.msct.util.SessionInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="sessionInterceptor"/>
<interceptor-ref name="defaultStack"/> <!--必需引用這個,否則點下一個子ACTION會報錯-->
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
</package&g......餘下全文>>