1. 程式人生 > >記錄在ssm框架專案中使用攔截器攔截非登入請求遇見的問題

記錄在ssm框架專案中使用攔截器攔截非登入請求遇見的問題

1.使用spring中的filter時,會出現bean注入失敗。這個問題一直沒解決。

報錯原因:web應用啟動的順序是:listener->filter->servlet,而因為專案應用了spring mvc,所以我們會有兩個配置檔案(applixationContext.xml和springMVC-sevlet.xml),我們在配置spring時會用到spring的listener,它會讀取application.xml裡的配置對spring context進行初始化;專案啟動時,先初始化listener,因此配置在applicationContext.xml裡的bean會被初始化和注入;然後再來就filter的初始化,再接著才到我們的dispathServlet的初始化,因此,當我們需要在filter裡注入一個註解的bean時,就會注入失敗,因為filter初始化時,註解的bean還沒初始化,沒法注入。

百度上搜 filter無法自動注入,會出現很多解決問題的文章,試了試一直沒解決這塊先放一下。

2.filter無法使用,我就改用了springmvc的HandlerInterceptorAdapter,在這遇到的問題就是ajax非同步請求不能實現頁面跳轉,然後百度之後解決了。下面把程式碼貼一下

public class FrontCommonInterceptor extends HandlerInterceptorAdapter{
    
private String[] filterUrl;

@Resource
private UsersService usersService;


@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws ServletException {
 
FrontHelper.frontData( request);
HttpSession session =request.getSession();
/*String token=(String) session.getAttribute("token");
System.out.println(token);*/
String path =request.getRequestURI();
System.out.println("------------"+path);
String type = request.getHeader("X-Requested-With");// XMLHttpRequest
String token=null;
Map<String, Object> map = (Map<String, Object>)((HttpServletRequest) request).getSession().getAttribute("user");
if(map!=null){
token = (String) map.get("token");

}

if (token != null) {

Users result = null;
try {
result = usersService.checkUser(token);
System.out.println("result = " + result);
if (result==null  ) {
session.removeAttribute("token");
session.removeAttribute("user");
token = null;
}
} catch (Exception e1) {
session.removeAttribute("token");
token = null;
}


}

if (token != null) {
if (path.indexOf("/login.html") > -1) {
try {
response.sendRedirect(response.encodeRedirectUrl("caipan-list.html"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
} else {

return true;
}


} else {
if (path.indexOf("/login.html") > -1  || path.indexOf("/login.do") > -1 ) {
return true;

}else{
String path2 = request.getContextPath();
               String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path2 + "/"+ "html/";
if (StringUtils.equals("XMLHttpRequest", type)) {
                   // ajax請求
response.setHeader("REDIRECT", "REDIRECT");
                   response.setHeader("CONTEXTPATH", basePath+"login.html");
                   response.setStatus(HttpServletResponse.SC_FORBIDDEN);//403 禁止
                   return false;
               } else {
                   try {
response.sendRedirect(basePath+"login.html");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
                   return false;
               }
              
}
  
}


}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {

}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {

}
public String[] getFilterUrl() {
return filterUrl;
}
public void setFilterUrl(String[] filterUrl) {
this.filterUrl = filterUrl;
}

   

}

上邊是攔截器邏輯程式碼,下面貼解決跳轉的

$.ajaxSetup( {    
        //設定ajax請求結束後的執行動作    
        complete : function(XMLHttpRequest, textStatus) {  
            // 通過XMLHttpRequest取得響應頭,REDIRECT    
            var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT說明後端想重定向  
            if (redirect == "REDIRECT") {  
                var win = window;    
                while (win != win.top){  
                    win = win.top;  
                }  
              //將後端重定向的地址取出來,使用win.location.href去實現重定向的要求  
              win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");    
            }  
        }    
    });