struts2拦截器登录校验无法正确处理json请求
本帖最后由 zhangchu_63 于 2012-01-04 17:18:36 编辑 最近做个项目用到了Flexigrid,部分操作使用AJAX提交。
系统配置了一个登录和session失效验证的struts2全局拦截器,当ajax请求发送到后台时,拦截器可以拦截,但是判断出没有登录或者session超时的时候却不能跳转到指定页面。
这样的话权限什么的根本没法做。
不知道我表述的有没有问题。
<package name="strutsCheckLogin" extends="json-default">
<interceptors>
<interceptor name="noLogin"
class="com.zc.zcproject.commonInterceptor.AuthorityInterceptor" />
<interceptor-stack name="appStack">
<interceptor-ref name="defaultStack" />
</interceptor-stack>
<interceptor-stack
name="defaultPaginationInterceptorStack">
<interceptor-ref name="noLogin" />
<interceptor-ref name="appStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref
name="defaultPaginationInterceptorStack" />
<global-results>
<result name="json" >
${pageContext.request.contextPath}/page/main_login.jsp
</result>
<result name="login" >
${pageContext.request.contextPath}/page/main_login.jsp
</result>
<result name="noframe">
${pageContext.request.contextPath}/page/error/error.jsp
</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="noframe"
exception="com.zc.zcproject.exception.AppException">
</exception-mapping>
</global-exception-mappings>
</package>
public String intercept(ActionInvocation ai) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ActionContext ctx = ai.getInvocationContext();
Map session = ctx.getSession();
Object ACCOUNT = (Object) session.get(Constants.USER);
if (ACCOUNT != null) {
return ai.invoke();
}
_logger.info("intercept user is not login");
if(isAjaxRequest(request)){
return "json";
}else{
System.out.println("login");
return "login";
}
}
private boolean isAjaxRequest(HttpServletRequest request) {
String header = request.getHeader("X-Requested-With");
if (header != null && "XMLHttpRequest".equals(header))
return true;
else
return false;
}
Map session = ctx.getSession();
Object ACCOUNT = (Object) session.get(Constants.USER);
if (ACCOUNT != null) {
return ai.invoke();
}
_logger.info("intercept user is not login");
if(isAjaxRequest(request)){
ValueStack stack = invocation.getStack();
Map<String, Object> returnResult = new HashMap<String, Object>();
// 向根对象加入1个MAP, KEY值与(<paramname="root">returnResult</param></result>)
//中root的值相同
stack.set("returnResult", returnResult);
returnResult.put("rtn", "01");
returnResult.put("msg", "没有权限");
return "input";
}else{
System.out.println("login");
return "login";
}
}
private boolean isAjaxRequest(HttpServletRequest request) {
String header = request.getHeader("X-Requested-With");
if (header != null && "XMLHttpRequest".equals(header))
return true;
else
return false;
}
struts.xml中加入配置文件
<global-results>
<result name="login" >login.jsp</result>
<result name="input" type="json">
<param name="root">returnResult</param>
</result>
</global-results>
这段配置1定要加入 继承json-default的package中.