原文地址:http://blog.csdn.net/liuwenbo0920/article/details/7283757
一般情況下,對來自瀏覽器的請求的攔截,是利用Filter實現的,這種方式可以實現Bean預處理、后處理。?
Spring MVC的攔截器不僅可實現Filter的所有功能,還可以更精確的控制攔截精度。?
Spring為我們提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter這個適配器,繼承此類,可以非常方便的實現自己的攔截器。他有三個方法:
?
[java]?view plaincopy
public?boolean?preHandle(HttpServletRequest?request,?HttpServletResponse?response,?Object?handler)????????????throws?Exception?{????????????return?true;????????}????????public?void?postHandle(????????????????HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?ModelAndView?modelAndView)????????????????throws?Exception?{????????}????????public?void?afterCompletion(????????????????HttpServletRequest?request,?HttpServletResponse?response,?Object?handler,?Exception?ex)????????????????throws?Exception?{????????}????
分別實現預處理、后處理(調用了Service并返回ModelAndView,但未進行頁面渲染)、返回處理(已經渲染了頁面)?
在preHandle中,可以進行編碼、安全控制等處理;?
在postHandle中,有機會修改ModelAndView;?
在afterCompletion中,可以根據ex是否為null判斷是否發生了異常,進行日志記錄。?
如果基于xml配置使用Spring MVC,
可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping進行Url映射(相當于struts的path映射)和攔截請求(注入interceptors),
如果基于注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors。
注意無論基于xml還是基于注解,HandlerMapping bean都是需要在xml中配置的。?
一個demo:?
在這個例子中,我們假設UserController中的注冊操作只在9:00-12:00開放,那么就可以使用攔截器實現這個功能。?
?
?
[java]?view plaincopy
public?class?TimeBasedAccessInterceptor?extends?HandlerInterceptorAdapter?{????????private?int?openingTime;????????private?int?closingTime;????????private?String?mappingURL;????public?void?setOpeningTime(int?openingTime)?{????????????this.openingTime?=?openingTime;????????}????????public?void?setClosingTime(int?closingTime)?{????????????this.closingTime?=?closingTime;????????}????????public?void?setMappingURL(String?mappingURL)?{????????????this.mappingURL?=?mappingURL;????????}????????@Override????????public?boolean?preHandle(HttpServletRequest?request,????????????????HttpServletResponse?response,?Object?handler)?throws?Exception?{????????????String?url=request.getRequestURL().toString();????????????if(mappingURL==null?||?url.matches(mappingURL)){????????????????Calendar?c=Calendar.getInstance();????????????????c.setTime(new?Date());????????????????int?now=c.get(Calendar.HOUR_OF_DAY);????????????????if(now<openingTime?||?now>closingTime){????????????????????request.setAttribute("msg",?"注冊開放時間:9:00-12:00");????????????????????request.getRequestDispatcher("/msg.jsp").forward(request,?response);????????????????????return?false;????????????????}????????????????return?true;????????????}????????????return?true;????????}????}????
xml配置:?
?
?
[html]?view plaincopy
<bean?id="timeBasedAccessInterceptor"?class="com.spring.handler.TimeBasedAccessInterceptor">????????<property?name="openingTime"?value="9"?/>????????<property?name="closingTime"?value="12"?/>????????<property?name="mappingURL"?value=".*/user\.do\?action=reg.*"?/>????</bean>????<bean?class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">????????<property?name="interceptors">????????????<list>????????????????<ref?bean="timeBasedAccessInterceptor"/>????????????</list>????????</property>????</bean>????
這里我們定義了一個mappingURL屬性,實現利用正則表達式對url進行匹配,從而更細粒度的進行攔截。當然如果不定義mappingURL,則默認攔截所有對Controller的請求。?
UserController:?
?
?
[java]?view plaincopy
@Controller????@RequestMapping("/user.do")????public?class?UserController{????????@Autowired????????private?UserService?userService;????????@RequestMapping(params="action=reg")????????public?ModelAndView?reg(Users?user)?throws?Exception?{????????????userService.addUser(user);????????????return?new?ModelAndView("profile","user",user);????????}????????}????
這個Controller相當于Struts的DispatchAction?
你也可以配置多個攔截器,每個攔截器進行不同的分工.?
轉載于:https://www.cnblogs.com/davidwang456/p/4511025.html
總結
以上是生活随笔為你收集整理的Spring MVC 中 HandlerInterceptorAdapter的使用--转载的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。