1. 程式人生 > 實用技巧 >SSM登入攔截驗證

SSM登入攔截驗證

/**
* 登陸攔截器,用於後臺管理系統攔截,判斷使用者是否登入
* @author ljy
* @date 2015/8/19
*/
public class LoginForAdminInterceptor extends HandlerInterceptorAdapter {
@Resource
private AdminService adminService;
//private static final String[] IGNORE_URI = {};//定義不攔截的資源

/*
* 在執行action裡面的處理邏輯之前執行,它返回的是boolean,這裡如果我們返回true在接著執行postHandle和afterCompletion,如果我們返回false則中斷執行。

*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,Object handler) throws Exception {
String url = request.getRequestURL().toString();
System.out.println(url);
boolean flag = false;//預設驗證失敗,即攔截請求
String message=null;//用於傳遞到前臺的資訊
HttpSession session=request.getSession();
Admin admin=(Admin)session.getAttribute("admin");
if(admin!=null){
//獲取最新賬戶資訊,並且如果賬戶被在其他地方修改密碼,那麼將被迫下線
admin=adminService.login(admin.getUsername(), admin.getPassword());
if(admin!=null){
flag=true;
session.setAttribute("admin", admin);
}else{
message="系統提示:您的賬戶資訊已經更改,請重新登入";
//移除可能過時的賬戶資訊
session.removeAttribute("admin");
}
}else{
message="登入超時,請重新登入";
}
if(flag==false){//如果沒有登入或登入異常
if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){//如果是ajax請求
//返回錯誤資訊
Map<String, Object> map = new HashMap<String, Object>();
map.put("status", -1);
map.put("myMessage", "請先登入!");
JSONObject jsonObject= JSONObject.fromObject(map);
//注意,必須加上這個,才能讓前端JS認為是JSON格式來進行相應處理
response.setContentType("application/json;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print(jsonObject.toString());
out.flush();
out.close();
}else{//如果是同步請求
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
//對資訊進行編碼處理,否則中文無法傳遞到前臺
message = java.net.URLEncoder.encode(message.toString(),"utf-8");
response.sendRedirect(basePath+"backstage/toLogin?myMessage="+message);
/*
* 說明:request.getRequestDispatcher跳轉時,由於地址還是被攔截的Controller請求,因此會導致執行兩次
* 從而可能導致異常,因此使用response.sendRedirect
*/
//request.setAttribute("myMessage",message);
//request.getRequestDispatcher("/admin/toLogin").forward(request,response);
}

}
return flag;
}

//在執行action裡面的邏輯後返回檢視之前執行。
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);

}

//在執行action裡面的邏輯後返回檢視之後執行。
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler,
Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);

}

}