最近做一个 电商前段网站,操作订单相关操作的时候,需要自定义拦截器:
拦截器代码如下:
package com.eshore.emall.web.interceptor;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.eshore.emall.pub.base.BaseInterceptor;
import com.eshore.emall.pub.constant.EmallConstants;
import com.eshore.emall.web.model.UserInfoBean;
import com.opensymphony.xwork2.ActionInvocation;
public class LoginInterceptor extends BaseInterceptor {
@SuppressWarnings("rawtypes")
public String intercept(ActionInvocation invocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession(false);
if (session == null) { //session已经过期
return getReturn("login");
}
UserInfoBean userInfoBean = (UserInfoBean)session.getAttribute("userInfo");
if(userInfoBean == null || !EmallConstants.USER_TYPE_REG.equals(userInfoBean.getUserType())){
return getReturn("login");
}
return invocation.invoke();
}
private String getReturn(String defaultReturn) {
String sessionOutMessage = "对不起,您还没有登录或登陆超时,请重新登陆!";
// ajax请求处理
if (isAjaxRequest()) {
//原始的方法
//setErrorTipMessage(TIMEOUT_TYPE, encode(sessionOutMessage));
//return "none";
//下面是修改后的方法
PrintWriter printWriter = null;
HttpServletResponse response = ServletActionContext.getResponse();
try {
printWriter = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
response.setCharacterEncoding("text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
printWriter.print("NO_LOGIN");
printWriter.flush();
printWriter.close();
return null;
} else {
//如果不是ajax请求
return defaultReturn;
}
}
}
isAjaxRequest方法:
protected boolean isAjaxRequest() {
HttpServletRequest request = ServletActionContext.getRequest();
return "XMLHttpRequest".equalsIgnoreCase(request
.getHeader("x-requested-with"));
}
这样拦截器部分就完成了,还有一点需要处理:如果你的请求时ajax请求:
实现代码如下:
$(".btn-shop").click(function(){
var storeId = $(this).attr("storeId")
var catentryId = $(this).attr("catentryId");
$.post(contextPath + "order/addToShoppingCart.action?purchaseCatEntryList[0].storeId="+storeId+"&purchaseCatEntryList[0].catEntryId="+catentryId+"&purchaseCatEntryList[0].quantity="+1 ,function(result){
if(result == "NO_LOGIN"){ //烂机器返回的ajax信息
alert("对不起,您还没有登录或登陆超时,请重新登陆!");
}else{
var results = result.split("@@poson@@");
if(results[0] == 'true'){
//alert(results[1]);
location.href=contextPath + "order/findShoppingCart.action";
} else {
alert(results[1]);
}
}
});
});
如果不是ajax请求,而是全局请求,则以上这不操作可以不要,直接设置action即可。