关键词搜索

源码搜索 ×
×

Spring MVC 中 HandlerInterceptorAdapter过滤器的使用

发布2015-10-16浏览3696次

详情内容

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 

Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

 

  1. 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。
  2. Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
  3. Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

 

 

  1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  2. throws Exception {
  3. return true;
  4. }
  5. public void postHandle(
  6. HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
  7. throws Exception {
  8. }
  9. public void afterCompletion(
  10. HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  11. throws Exception {
  12. }

 

 

 

分别实现预处理、后处理(调用了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开放,那么就可以使用拦截器实现这个功能。 

 

 

 

  1. public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
  2. private int openingTime;
  3. private int closingTime;
  4. private String mappingURL;//利用正则映射到需要拦截的路径
  5. public void setOpeningTime(int openingTime) {
  6. this.openingTime = openingTime;
  7. }
  8. public void setClosingTime(int closingTime) {
  9. this.closingTime = closingTime;
  10. }
  11. public void setMappingURL(String mappingURL) {
  12. this.mappingURL = mappingURL;
  13. }
  14. @Override
  15. public boolean preHandle(HttpServletRequest request,
  16. HttpServletResponse response, Object handler) throws Exception {
  17. String url=request.getRequestURL().toString();
  18. if(mappingURL==null || url.matches(mappingURL)){
  19. Calendar c=Calendar.getInstance();
  20. c.setTime(new Date());
  21. int now=c.get(Calendar.HOUR_OF_DAY);
  22. if(now<openingTime || now>closingTime){
  23. request.setAttribute("msg", "注册开放时间:9:00-12:00");
  24. request.getRequestDispatcher("/msg.jsp").forward(request, response);
  25. return false;
  26. }
  27. return true;
  28. }
  29. return true;
  30. }
  31. }

xml配置:

 

  1. <bean id="timeBasedAccessInterceptor" class="com.spring.handler.TimeBasedAccessInterceptor">
  2. <property name="openingTime" value="9" />
  3. <property name="closingTime" value="12" />
  4. <property name="mappingURL" value=".*/user\.do\?action=reg.*" />
  5. </bean>
  6. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  7. <property name="interceptors">
  8. <list>
  9. <ref bean="timeBasedAccessInterceptor"/>
  10. </list>
  11. </property>
  12. </bean>


这里我们定义了一个mappingURL属性,实现利用正则表达式对url进行匹配,从而更细粒度的进行拦截。当然如果不定义mappingURL,则默认拦截所有对Controller的请求。 

 

UserController:

 

  1. @Controller
  2. @RequestMapping("/user.do")
  3. public class UserController{
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping(params="action=reg")
  7. public ModelAndView reg(Users user) throws Exception {
  8. userService.addUser(user);
  9. return new ModelAndView("profile","user",user);
  10. }
  11. // other option ...
  12. }

这个Controller相当于Struts的DispatchAction 

你也可以配置多个拦截器,每个拦截器进行不同的分工. 

 

 

我们项目里面的例子

 


 

 

  1. package com.shishuo.studio.filter;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.servlet.HandlerInterceptor;
  7. import org.springframework.web.servlet.ModelAndView;
  8. import com.shishuo.studio.entity.User;
  9. import com.shishuo.studio.exception.CookieNotFoundException;
  10. import com.shishuo.studio.service.UserService;
  11. import com.shishuo.studio.util.CookieUtils;
  12. /**
  13. * @author Herbert 拦截器的实现
  14. */
  15. @Component
  16. public class AuthInterceptor implements HandlerInterceptor {
  17. @Autowired
  18. private UserService userService;
  19. public void afterCompletion(HttpServletRequest request,
  20. HttpServletResponse respone, Object object, Exception exception)
  21. throws Exception {
  22. // TODO Auto-generated method stub
  23. }
  24. public void postHandle(HttpServletRequest request,
  25. HttpServletResponse response, Object object,
  26. ModelAndView modelAndView) throws Exception {
  27. }
  28. public boolean preHandle(HttpServletRequest request,
  29. HttpServletResponse response, Object handler) throws Exception {
  30. try {
  31. User user = userService.getUserById(request);
  32. if (userService.checkAuth(user, request, response)) {
  33. return true;
  34. } else {
  35. response.sendRedirect("/user/login.htm");
  36. return false;
  37. }
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. response.sendRedirect("/user/login.htm");
  42. return false;
  43. }
  44. }

 

  1. package com.shishuo.studio.filter;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.servlet.HandlerInterceptor;
  7. import org.springframework.web.servlet.ModelAndView;
  8. import com.shishuo.studio.service.CategoryService;
  9. /**
  10. * @author Herbert
  11. *
  12. */
  13. @Component
  14. public class GlobalInterceptor implements HandlerInterceptor {
  15. @Autowired
  16. private CategoryService categoryService;
  17. @Override
  18. public boolean preHandle(HttpServletRequest request,
  19. HttpServletResponse response, Object handler) throws Exception {
  20. return true;
  21. }
  22. @Override
  23. public void postHandle(HttpServletRequest request,
  24. HttpServletResponse response, Object handler,
  25. ModelAndView modelAndView) throws Exception {
  26. if (null == modelAndView) {
  27. return;
  28. }
  29. // 系统配置参数
  30. modelAndView.addObject("categoryList",
  31. categoryService.getCategoryListOfDisplayByFatherId(0));
  32. }
  33. @Override
  34. public void afterCompletion(HttpServletRequest request,
  35. HttpServletResponse response, Object handler, Exception ex)
  36. throws Exception {
  37. // TODO Auto-generated method stub
  38. }
  39. }

 

  1. package com.shishuo.studio.filter;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.servlet.HandlerInterceptor;
  7. import org.springframework.web.servlet.ModelAndView;
  8. import com.shishuo.studio.entity.User;
  9. import com.shishuo.studio.entity.vo.StudioVo;
  10. import com.shishuo.studio.exception.StudioNotFoundException;
  11. import com.shishuo.studio.service.StudioService;
  12. import com.shishuo.studio.service.UserService;
  13. /**
  14. * @author Herbert
  15. *
  16. */
  17. @Component
  18. public class StudioInterceptor implements HandlerInterceptor {
  19. @Autowired
  20. private StudioService studioService;
  21. @Autowired
  22. private UserService userService;
  23. @Override
  24. public boolean preHandle(HttpServletRequest request,
  25. HttpServletResponse response, Object handler) throws Exception {
  26. User user = userService.getUserById(request);
  27. try {
  28. StudioVo studio = studioService.getStudioById(user.getUserId());
  29. return true;
  30. } catch (StudioNotFoundException e) {
  31. response.sendRedirect("/auth/teacher/studio.htm");
  32. return false;
  33. }
  34. }
  35. @Override
  36. public void postHandle(HttpServletRequest request,
  37. HttpServletResponse response, Object handler,
  38. ModelAndView modelAndView) throws Exception {
  39. }
  40. @Override
  41. public void afterCompletion(HttpServletRequest request,
  42. HttpServletResponse response, Object handler, Exception ex)
  43. throws Exception {
  44. }
  45. }

 

 

 

 

 

相关技术文章

最新源码

下载排行榜

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载