記錄在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;
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);*/
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");
}
}
});