`
韩悠悠
  • 浏览: 842543 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SpringMVC中HandlerInterceptorAdapter的使用

 
阅读更多

 

一般情况下,对来自浏览器的请求的拦截,是利用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
可以利用SimpleUrlHandlerMappingBeanNameUrlHandlerMapping进行Url映射(相当于strutspath映射)和拦截请求(注入interceptors),
如果基于注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors
注意无论基于xml还是基于注解,HandlerMapping bean都是需要在xml中配置的。

一个demo
在这个例子中,我们假设UserController中的注册操作只在900-1200开放,那么就可以使用拦截器实现这个功能。 

 

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相当于StrutsDispatchAction

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

分享到:
评论

相关推荐

    SpringMVC学习编程代码

    在SpringMVC中,我们可以使用`ModelAndView`对象或者直接返回字符串来指定视图。例如,`return "success";`表示重定向到名为"success"的视图页面。 此外,SpringMVC支持数据绑定和验证,可以通过`@ModelAttribute`...

    企业级开发-SpringMVC使用拦截器实现用户登录权限验证实验报告.docx

    在企业级开发中,SpringMVC 是一个广泛使用的框架,用于构建高效、模块化和可测试的 Web 应用程序。本实验报告将探讨如何利用 SpringMVC 的拦截器(Interceptor)来实现用户登录权限验证,确保只有已登录的用户才能...

    SpringMVC中使用Interceptor拦截器

    本篇文章将深入探讨如何在Spring MVC中使用Interceptor拦截器。 首先,Interceptor的实现需要继承自`HandlerInterceptor`接口或者实现`HandlerInterceptorAdapter`适配器类,这两个类都包含三个核心方法: 1. `...

    浅谈SpringMVC HandlerInterceptor诡异问题排查

    SpringMVC中的HandlerInterceptor是非常重要的组件之一,它可以在请求处理的各个阶段进行干预和修改。本文将主要介绍如何排查SpringMVC HandlerInterceptor中的诡异问题,解决问题的思路和方法,并对相关的源代码...

    SpringMVC 中的拦截器与异常处理

    1. 拦截器的注册:拦截器需要在SpringMVC配置中进行注册,通过`&lt;mvc:interceptors&gt;`标签或者在Java配置中使用`addInterceptors()`方法添加到拦截器链中。每个拦截器都有`preHandle()`, `postHandle()` 和 `...

    SpringMVC拦截器的使用

    在这个主题中,我们将深入探讨如何使用Spring MVC的Interceptor进行登录验证。 首先,我们了解拦截器的基本概念。在Spring MVC中,拦截器是实现了`HandlerInterceptor`接口的类,它有三个主要方法: 1. `preHandle...

    J简单的springmvc包括拦截、session设置,超时跳转

    在这个"简单的springmvc包括拦截、session设置,超时跳转"的项目中,我们将探讨这三个核心概念。 **拦截器(Interceptors)** 在Spring MVC中,拦截器是一种机制,可以对HTTP请求进行预处理和后处理。它们在控制器...

    springmvc课堂笔记

    **SpringMVC**是Spring框架中的一个重要组成部分,主要用于构建Web应用程序。它遵循MVC(Model-View-Controller)设计模式,帮助开发者构建出清晰分层的应用架构,提高代码的可维护性和可扩展性。 ##### 1.1 ...

    SpringMVC课堂笔记(1)

    **SpringMVC**是Spring框架中的一个重要组成部分,主要用于构建Web应用程序。它遵循MVC(Model-View-Controller)设计模式,帮助开发者构建出清晰分层的应用架构,提高代码的可维护性和可扩展性。 #### 二、...

    跟我学SpringMVC

    - **控制器接口**:SpringMVC中的控制器可以通过实现Controller接口或者使用@Controller注解来定义。 - **处理请求的方法**:详细讲解了如何通过控制器中的方法来处理不同的HTTP请求,如GET、POST等。 - **视图返回*...

    SpringMVC教学视频(包括整合spring和mybatis)网盘

    2. **配置SpringMVC核心组件**:在SpringMVC的配置文件中配置HandlerMapping、HandlerAdapter、ViewResolver等。 3. **配置静态资源过滤**:可配置SpringMVC自动处理静态资源,如CSS、JS等。 4. **配置拦截器**:...

    Spring框架的SpringMVC

    开发者需要在web.xml中配置DispatcherServlet,并指定其配置文件(如servlet-context.xml),该文件中定义了SpringMVC的bean,如HandlerMapping、HandlerAdapter等。 4. **请求映射**: HandlerMapping负责将请求...

    SpringMVC学习(十二)——SpringMVC中的拦截器

    2. 使用Java配置:在`WebMvcConfigurer`接口的实现类中,使用`addInterceptors()`方法添加拦截器。 实际应用场景包括但不限于: 1. 权限验证:在请求处理前检查用户登录状态,未登录时重定向到登录页面。 2. 访问...

    springMVC拦截器

    1. **自定义异常处理器**:在控制器方法中使用 `@ExceptionHandler` 注解处理特定的异常。 ```java @Controller public class MyController { @ExceptionHandler(MyException.class) public ModelAndView ...

    springmvc高级.docx

    通过实现`HandlerInterceptor`接口或继承`HandlerInterceptorAdapter`,并注册到Spring MVC配置中,即可启用拦截器。 以上就是Spring MVC高级应用的主要内容。通过这些功能,开发者可以构建出功能强大、结构清晰的...

    SpringMVC相关面试题.zip

    在面试中,了解SpringMVC的相关知识是评估开发者技能的重要标准。以下是一些核心知识点的详细说明: 1. **SpringMVC与Struts1/Struts2的比较**: - **SpringMVC**:提供了更灵活的依赖注入(DI),支持注解配置,...

    跟开涛学SpringMVC(4.6)Controller接

    首先,Controller接口在SpringMVC中并不是一个实际的接口,而是通过使用@Controller注解来标识一个类作为控制器。这个注解告诉Spring框架,这个类中的方法将负责处理来自客户端的请求。例如: ```java @Controller ...

    SpringMVC与Mybatis整合

    2. **配置SpringMVC**:创建`springmvc-servlet.xml`配置文件,配置DispatcherServlet、视图解析器(如InternalResourceViewResolver)、拦截器(如HandlerInterceptorAdapter)、模型-视图对(ModelAndView)等。...

    springmvc+ssm

    SSM框架是指SpringMVC、Spring和MyBatis这三个框架的集成使用,用于快速构建Web应用。 - **Spring**:负责管理Bean的生命周期和依赖注入。 - **SpringMVC**:负责处理用户的请求并分发到合适的控制器。 - **MyBatis...

    springMVC的深入研究

    Spring3 MVC支持使用父级上下文,这意味着可以在父级上下文中定义共享的Bean,这些Bean可以在多个子上下文中使用,从而避免重复定义相同的Bean。这对于简化配置和提高代码复用性非常有用。 #### 六、springMVC-mvc....

Global site tag (gtag.js) - Google Analytics