Springmvc攔截器的配置與應用
阿新 • • 發佈:2018-11-10
今天介紹下springmvc學習中的攔截器,常用我們在訪問專案的時候會攔截判斷使用者是否登入等,有點類似於我們在servlet中使用的filter過濾器
1.那麼springmvc攔截器是在什麼地方攔截的(執行規則)?
2.springmvc攔截器是怎麼在專案中應用的?
我們定義一個攔截器的類,實現HandlerInterceptor介面:
接著我們在springmvc的配置檔案中配置攔截
只有當攔截器的方法preHandle返回了true,才可以執行後面的兩個方法
那麼如果我們配置了多個攔截器,那麼他的執行規則怎麼樣的,我們來配置多個攔截器測試
<!-- SPringmvc的攔截器 ,裡面可以放多個攔截器--> <mvc:interceptors> <mvc:interceptor> <!-- 攔截的路徑--> <mvc:mapping path="/**" /> <!-- 定義的攔截器類--> <bean class="com.itheima.springmvc.interceptor.interceptor3"/> </mvc:interceptor> <mvc:interceptor> <!-- 攔截的路徑--> <mvc:mapping path="/**" /> <!-- 定義的攔截器類--> <bean class="com.itheima.springmvc.interceptor.interceptor4"/> </mvc:interceptor> </mvc:interceptors>
package com.itheima.springmvc.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class interceptor4 implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { System.out.println("preHandle4方法是在controller方法的執行之前執行"); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3) throws Exception { System.out.println("postHandle4方法是方法的執行之後執行"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) throws Exception { System.out.println("afterCompletion4方法是方在jsp-->html頁面渲染後再執行"); }}
我們來看下執行的結果
總結:
preHandle按攔截器定義順序呼叫
postHandler按攔截器定義逆序呼叫
afterCompletion按攔截器定義逆序呼叫
postHandler在攔截器鏈內所有攔截器返成功呼叫
afterCompletion只有preHandle返回true才呼叫
攔截器的執行規則大家知道了,那麼我們來應用一下,後面用程式碼來解釋
public class interceptor3 implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { System.out.println("preHandle3方法是在controller方法的執行之前執行"); //判斷使用者的請求是否是在登入的頁面,不是的話重定向到登入的頁面 String requestURI = request.getRequestURI(); if(!requestURI.contains("/login")){ String username = (String) request.getSession().getAttribute("USER_SESSION"); if(null == username){ response.sendRedirect(request.getContextPath() + "/login.action"); return false; } } //登入的話直接放行 return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3) throws Exception { System.out.println("postHandle3方法是方法的執行之後執行"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) throws Exception { System.out.println("afterCompletion3方法是方在jsp-->html頁面渲染後再執行"); }
//去登陸的頁面
@RequestMapping(value = "/login.action",method = RequestMethod.GET)
public String login(){
return "login";
}
@RequestMapping(value = "/login.action",method = RequestMethod.POST)
public String login(String username
,HttpSession httpSession){
//登入後將資訊放在session中,轉發到列表頁面
httpSession.setAttribute("USER_SESSION", username);
return "redirect:/item/itemlist.action";
}