SpringMVC 拦截器开发详解

简介: SpringMVC 拦截器开发详解

一、拦截器介绍

1、拦截器的应用场景

  • 1、日志记录:记录请求信息的日志
  • 2、权限检查,如登录检查
  • 3、性能检测:检测方法的执行时间

2、拦截器的执行原理

3、拦截器执行的时机

  • (1)preHandle():在请求被处理之前进行操作
  • (2)postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果
  • (3)afterCompletion:所有的请求响应结束后执行善后工作,清理对象,关闭资源

4、拦截器实现的两种方式

  • (1)继承HandlerInterceptorAdapter的父类
  • (2)实现HandlerInterceptor接口,实现的接口,推荐使用实现接口的方式

二、HandlerInterceptor接口分析

自定义拦截器,需要实现 HandlerInterceptor 接口。而该接口中含有三个方法:

1、preHandle

该方法在处理器方法执行之前执行。其返回值为 boolean,若为 true,则紧接着会执行处理器方法,且会将 afterCompletion()方法放入到一个专门的方法栈中等待执行。

总结一句话就是:在请求被处理之前进行操作,预处理.

2、postHandle

该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。

总结一句话就是:在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果,后处理.

3、afterCompletion

当preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法。即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此时对 ModelAndView 再操作也对响应无济于事。afterCompletion 最后执行的方法,清除资源,例如在 Controller 方法中加入数据等。

总结一句话就是:所有的请求响应结束后执行善后工作,清理对象,关闭资源 ,最终处理.

三、自定义拦截器实现权限验证

实现一个权限验证拦截器。

1.改造登录方法,在session中存储用户信息,用于进行权限验证

@Controller
public class LoginController {
    @RequestMapping("/showLogin")
    public String showLogin(){
        return "login";
    }
    @RequestMapping("/login")
    public String login(String name,String password,HttpServletRequest request){
        if("admin".equals(name) && "admin".equals(password)){
            request.getSession().setAttribute("users",name);
            return "index";
        }
        request.setAttribute("msg","用户名或者密码错误");
        return "login";
    }
}

2.开发拦截器的功能.实现HandlerInterceptor接口,重写preHandle()方法

public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(request.getSession().getAttribute("users") == null){
            request.setAttribute("msg","您还没有登录哦");
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
            return false;
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

3.在springmvc.xml文件中注册拦截器

<!--注册拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/login"/>
            <mvc:exclude-mapping path="/showLogin"/>
            <bean class="com.bjpowernode.interceptor.LoginHandlerInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

四、拦截器总结陈述

SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。


相关文章
|
1月前
SpringMVC之拦截器和异常处理器
【1月更文挑战第20天】SpringMVC之拦截器和异常处理器
53 0
|
7月前
|
缓存 前端开发 Java
SpringMVC之JSR303和拦截器
SpringMVC之JSR303和拦截器
49 0
|
8月前
|
前端开发 Java 数据库连接
SpringMVC系列(五)之JSR303和拦截器
SpringMVC系列(五)之JSR303和拦截器
|
7月前
|
监控 前端开发 Java
SpringMVC之JSR303使用及拦截器使用(带你探索SpringMVC的新领域)
SpringMVC之JSR303使用及拦截器使用(带你探索SpringMVC的新领域)
55 0
|
1月前
|
前端开发 Java Apache
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
83 0
JAVAEE框架技术之6-springMVC拦截器和文件上传功能
|
1月前
SpringMVC拦截器的介绍,拦截器的基本实现,拦截器链配置
SpringMVC拦截器的介绍,拦截器的基本实现,拦截器链配置
33 2
|
7月前
|
缓存 前端开发 Java
【SpringMVC】JSR 303与拦截器注解使用
【SpringMVC】JSR 303与拦截器注解使用
47 0
|
7月前
|
开发框架 监控 Java
SpringMVC之JSR303和拦截器
SpringMVC之JSR303和拦截器
41 0
|
1月前
|
前端开发 Java 应用服务中间件
SpringMvc拦截器和手写模拟SpringMvc工作流程源码详解
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。 M: Model,模型层,指工程中的JavaBean,作用是处理数据。 JavaBean分为两类: 1.实体类Bean:专门存储业务数据的,如Student User等 2.业务处理Bean:指Service或Dao对象,专门用于处理业务逻辑和数据访问。
|
1月前
|
前端开发 JavaScript Java
Spring Boot中Spring MVC的基本配置讲解与实战(包括静态资源配置,拦截器配置,文件上传配置及实战 附源码)
Spring Boot中Spring MVC的基本配置讲解与实战(包括静态资源配置,拦截器配置,文件上传配置及实战 附源码)
88 1