資料學習參考這裏http://jinnianshilongnian.iteye.com/blog/1752171
springmvc攔截器
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
}
preHandle:預處理回調方法,實現處理器的預處理(如登錄檢查),第三個參數爲響應的處理器(如我們上一章的Controller實現);返回值:true 表示繼續流程(如調用下一個攔截器或處理器); false表示流程中斷(如登錄檢查失敗),不會繼續調用其他的攔截器或處理器,此時我們需要 通過response來產生響應;
postHandle:後處理回調方法,實現處理器的後處理(但在渲染視圖之前),此時我們可以通過modelAndView(模型和視圖對象)對模型數據進行處 理或對視圖進行處理,modelAndView也可能爲null;
afterCompletion:整個請求處理完畢回調方法,即在視圖渲染完畢時回調;
如果我們不想實現全部的方法,只使用其中的部分方法,可以繼續HandlerInterceptorAdapter(適配器模式)
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
return super.preHandle(request, response, handler);
}
}
入門小程序
定義攔截器:
public class MyInterceptorOne implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("MyInterceptorOne===preHandle");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptorOne===postHandle");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("MyInterceptorOne===afterCompletion");
}
}
MyInterceptorTwo同MyInterceptorOne,但是sysout需要修改;
配置文件:
<!-- 映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="myInterceptorOne"/>
<ref bean="myInterceptorTwo"/>
</list>
</property>
</bean>
<!-- 適配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 試圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 處理器 -->
<bean name="/hello" class="springMVC.HelloWorldController"></bean>
<!-- 攔截器 -->
<bean id="myInterceptorOne" class="lee.springmvc.interceptor.MyInterceptorOne"></bean>
<bean id="myInterceptorTwo" class="lee.springmvc.interceptor.MyInterceptorTwo"></bean>
訪問hello控制檯輸出如下:
MyInterceptorOne===preHandle
MyInterceptorTwo===preHandle
MyInterceptorTwo===postHandle
MyInterceptorOne===postHandle
MyInterceptorTwo===afterCompletion
MyInterceptorOne===afterCompletion
public class LoginInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//1、請求到登錄頁面 放行
if(request.getServletPath().startsWith("loginUrl")) {
return true;
}
//2、比如退出、首頁等頁面無需登錄
//3、如果用戶已經登錄 放行
if(request.getSession().getAttribute("username") != null) {
//更好的實現方式的使用cookie
return true;
}
//4、如果頁面上某個按鈕進行ajax請求後臺數據。用戶請求前,服務器突然關掉,之後服務器啓動,用戶正好點擊按鈕進行ajax後臺請求
//此時應該進行重定向到登錄頁面,需要加上如下代碼,否則頁面不發送任何改變
if("XMLHttpRequest".equals(request.getHeader("X-Requested-With")) && request.getSession().getAttribute("username") == null){//判斷是否爲ajax請求
PrintWriter out = response.getWriter();//如果是ajax請求,返回一個標識,告訴ajax請求無效,需要重新登錄
out.print("login");
return false;
}
//5、非法請求 即這些請求需要登錄後才能訪問
//重定向到登錄頁面
response.sendRedirect(request.getContextPath() + "loginUrl");
return false;
}
}
推薦能使用servlet規範中的過濾器Filte