执行页面的post请求时,无法正常跳转到登录页面,经过调研,发现是拦截器的处理问题,拦截器只对方法进行拦截,没有考虑post回调函数才导致出现上述Bug。
下面是解决办法:
首先,优化拦截器:
/**
* 用户登入校验登入
* @author Administrator
*
*/
//可以对请求方法
public class LoginInterceptor extends MethodFilterInterceptor {
//序列号
private static final long serialVersionUID = 1307687631270550421L;
@Override
public String doIntercept(ActionInvocation invocation) throws Exception {
Map<String,Object> session=ActionContext.getContext().getSession();
//取到session的封装对象
Object obj=session.get(SessionAttributeKey.LOGIN_USER);
if(obj==null){
//打印对象
System.out.println("对象"+obj);
//获取request域中信息
HttpServletRequest req = ServletActionContext.getRequest();
//获得当前请求地址
String url = req.getServletPath();
//获得请求类型
String type = req.getHeader("X-Requested-With");
//判断是否是同步请求或者是异步请求
if(type.equalsIgnoreCase("XMLHttpRequest")){
//存放url地址
System.out.println(url);
session.put(SessionAttributeKey.XIAOMI_URL, "url");
JsonObject<Object> jsonObject=new JsonObject<Object>();
jsonObject.setObject(obj);
return null;
}else{
session.put(SessionAttributeKey.ERROR_MSG, "请登入后再进行操作!!!!");
return "login";
}
}
return invocation.invoke();//invocation.invoke() 就是通知struts2接着干下面的事情;返回验证通过
}
}
* 用户登入校验登入
* @author Administrator
*
*/
//可以对请求方法
public class LoginInterceptor extends MethodFilterInterceptor {
//序列号
private static final long serialVersionUID = 1307687631270550421L;
@Override
public String doIntercept(ActionInvocation invocation) throws Exception {
Map<String,Object> session=ActionContext.getContext().getSession();
//取到session的封装对象
Object obj=session.get(SessionAttributeKey.LOGIN_USER);
if(obj==null){
//打印对象
System.out.println("对象"+obj);
//获取request域中信息
HttpServletRequest req = ServletActionContext.getRequest();
//获得当前请求地址
String url = req.getServletPath();
//获得请求类型
String type = req.getHeader("X-Requested-With");
//判断是否是同步请求或者是异步请求
if(type.equalsIgnoreCase("XMLHttpRequest")){
//存放url地址
System.out.println(url);
session.put(SessionAttributeKey.XIAOMI_URL, "url");
JsonObject<Object> jsonObject=new JsonObject<Object>();
jsonObject.setObject(obj);
return null;
}else{
session.put(SessionAttributeKey.ERROR_MSG, "请登入后再进行操作!!!!");
return "login";
}
}
return invocation.invoke();//invocation.invoke() 就是通知struts2接着干下面的事情;返回验证通过
}
}
前台js代码:
function publish1(){
var comCont=$.trim($("#text1").val());
var artId=$.trim($("#artId").val());
var usersId=$.trim($("#usersId").val());
var str="";
var comCont=$.trim($("#text1").val());
var artId=$.trim($("#artId").val());
var usersId=$.trim($("#usersId").val());
var str="";
//发送post请求
$.post("front/artcomment_addArtComment.action",{comCont:comCont,artId:artId,usersId:usersId},function(data){
$.post("front/artcomment_addArtComment.action",{comCont:comCont,artId:artId,usersId:usersId},function(data){
//判断回调函数值
if(data=='' || data==undefined || data==null){
if(window.confirm('您尚未登录,请登录后再发表评论!')){
window.location.href = 'front/login.jsp';
}
}else{
var artcomments=data.object.artcomments;
for(var i=0;i<artcomments.length;i++){
str+="<li>";
str+="<div class='reply_list_img'><img src='front/images/reply_list_img1.jpg'></div>";
str+="<div class='reply_list_con'><div class='user_info'><a>"+artcomments[i].usersName+"</a> <span>发布于</span><span>"+artcomments[i].comDate+"</span><span id='reply_floor'></span></div><div class='main_con'>"+artcomments[i].comCont+"</div></div>";
str+="</div>";
}
$("#reply_list").html(str);
}
});
}
if(data=='' || data==undefined || data==null){
if(window.confirm('您尚未登录,请登录后再发表评论!')){
window.location.href = 'front/login.jsp';
}
}else{
var artcomments=data.object.artcomments;
for(var i=0;i<artcomments.length;i++){
str+="<li>";
str+="<div class='reply_list_img'><img src='front/images/reply_list_img1.jpg'></div>";
str+="<div class='reply_list_con'><div class='user_info'><a>"+artcomments[i].usersName+"</a> <span>发布于</span><span>"+artcomments[i].comDate+"</span><span id='reply_floor'></span></div><div class='main_con'>"+artcomments[i].comCont+"</div></div>";
str+="</div>";
}
$("#reply_list").html(str);
}
});
}
struts.xml文件配置:
<package name="xmFront" namespace="/front" extends="json-default">
<!--拦截器 -->
<interceptors>
<interceptor name="loginInterceptor" class="com.xiaomi.web.interceptor.LoginInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="loginInterceptor">
<param name="includeMethods">addArtComment</param><!-- 要过滤的请求方法 -->
</interceptor-ref>
</interceptor-stack>
</interceptors>
<global-results>
<result name="login" type="redirect">/front/login.jsp</result>
</global-results>
<action name="*_*" class="{1}Action" method="{2}">
<interceptor-ref name="myStack"/>
<result type="json">
<param name="root">jsonObject</param>
</result>
</action>
</package>
<!--拦截器 -->
<interceptors>
<interceptor name="loginInterceptor" class="com.xiaomi.web.interceptor.LoginInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="loginInterceptor">
<param name="includeMethods">addArtComment</param><!-- 要过滤的请求方法 -->
</interceptor-ref>
</interceptor-stack>
</interceptors>
<global-results>
<result name="login" type="redirect">/front/login.jsp</result>
</global-results>
<action name="*_*" class="{1}Action" method="{2}">
<interceptor-ref name="myStack"/>
<result type="json">
<param name="root">jsonObject</param>
</result>
</action>
</package>