一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:
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开放,那么就可以使用拦截器实现这个功能。
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配置:
<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的请求。
@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); } // other option ... }
这个Controller相当于Struts的DispatchAction
你也可以配置多个拦截器,每个拦截器进行不同的分工.
相关推荐
在SpringMVC中,我们可以使用`ModelAndView`对象或者直接返回字符串来指定视图。例如,`return "success";`表示重定向到名为"success"的视图页面。 此外,SpringMVC支持数据绑定和验证,可以通过`@ModelAttribute`...
在企业级开发中,SpringMVC 是一个广泛使用的框架,用于构建高效、模块化和可测试的 Web 应用程序。本实验报告将探讨如何利用 SpringMVC 的拦截器(Interceptor)来实现用户登录权限验证,确保只有已登录的用户才能...
本篇文章将深入探讨如何在Spring MVC中使用Interceptor拦截器。 首先,Interceptor的实现需要继承自`HandlerInterceptor`接口或者实现`HandlerInterceptorAdapter`适配器类,这两个类都包含三个核心方法: 1. `...
SpringMVC中的HandlerInterceptor是非常重要的组件之一,它可以在请求处理的各个阶段进行干预和修改。本文将主要介绍如何排查SpringMVC HandlerInterceptor中的诡异问题,解决问题的思路和方法,并对相关的源代码...
1. 拦截器的注册:拦截器需要在SpringMVC配置中进行注册,通过`<mvc:interceptors>`标签或者在Java配置中使用`addInterceptors()`方法添加到拦截器链中。每个拦截器都有`preHandle()`, `postHandle()` 和 `...
在这个主题中,我们将深入探讨如何使用Spring MVC的Interceptor进行登录验证。 首先,我们了解拦截器的基本概念。在Spring MVC中,拦截器是实现了`HandlerInterceptor`接口的类,它有三个主要方法: 1. `preHandle...
在这个"简单的springmvc包括拦截、session设置,超时跳转"的项目中,我们将探讨这三个核心概念。 **拦截器(Interceptors)** 在Spring MVC中,拦截器是一种机制,可以对HTTP请求进行预处理和后处理。它们在控制器...
**SpringMVC**是Spring框架中的一个重要组成部分,主要用于构建Web应用程序。它遵循MVC(Model-View-Controller)设计模式,帮助开发者构建出清晰分层的应用架构,提高代码的可维护性和可扩展性。 ##### 1.1 ...
**SpringMVC**是Spring框架中的一个重要组成部分,主要用于构建Web应用程序。它遵循MVC(Model-View-Controller)设计模式,帮助开发者构建出清晰分层的应用架构,提高代码的可维护性和可扩展性。 #### 二、...
- **控制器接口**:SpringMVC中的控制器可以通过实现Controller接口或者使用@Controller注解来定义。 - **处理请求的方法**:详细讲解了如何通过控制器中的方法来处理不同的HTTP请求,如GET、POST等。 - **视图返回*...
2. **配置SpringMVC核心组件**:在SpringMVC的配置文件中配置HandlerMapping、HandlerAdapter、ViewResolver等。 3. **配置静态资源过滤**:可配置SpringMVC自动处理静态资源,如CSS、JS等。 4. **配置拦截器**:...
开发者需要在web.xml中配置DispatcherServlet,并指定其配置文件(如servlet-context.xml),该文件中定义了SpringMVC的bean,如HandlerMapping、HandlerAdapter等。 4. **请求映射**: HandlerMapping负责将请求...
2. 使用Java配置:在`WebMvcConfigurer`接口的实现类中,使用`addInterceptors()`方法添加拦截器。 实际应用场景包括但不限于: 1. 权限验证:在请求处理前检查用户登录状态,未登录时重定向到登录页面。 2. 访问...
1. **自定义异常处理器**:在控制器方法中使用 `@ExceptionHandler` 注解处理特定的异常。 ```java @Controller public class MyController { @ExceptionHandler(MyException.class) public ModelAndView ...
通过实现`HandlerInterceptor`接口或继承`HandlerInterceptorAdapter`,并注册到Spring MVC配置中,即可启用拦截器。 以上就是Spring MVC高级应用的主要内容。通过这些功能,开发者可以构建出功能强大、结构清晰的...
在面试中,了解SpringMVC的相关知识是评估开发者技能的重要标准。以下是一些核心知识点的详细说明: 1. **SpringMVC与Struts1/Struts2的比较**: - **SpringMVC**:提供了更灵活的依赖注入(DI),支持注解配置,...
首先,Controller接口在SpringMVC中并不是一个实际的接口,而是通过使用@Controller注解来标识一个类作为控制器。这个注解告诉Spring框架,这个类中的方法将负责处理来自客户端的请求。例如: ```java @Controller ...
2. **配置SpringMVC**:创建`springmvc-servlet.xml`配置文件,配置DispatcherServlet、视图解析器(如InternalResourceViewResolver)、拦截器(如HandlerInterceptorAdapter)、模型-视图对(ModelAndView)等。...
SSM框架是指SpringMVC、Spring和MyBatis这三个框架的集成使用,用于快速构建Web应用。 - **Spring**:负责管理Bean的生命周期和依赖注入。 - **SpringMVC**:负责处理用户的请求并分发到合适的控制器。 - **MyBatis...
Spring3 MVC支持使用父级上下文,这意味着可以在父级上下文中定义共享的Bean,这些Bean可以在多个子上下文中使用,从而避免重复定义相同的Bean。这对于简化配置和提高代码复用性非常有用。 #### 六、springMVC-mvc....