欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

08-SpringMVC核心之一个拦截器

程序员文章站 2022-07-09 18:10:12
...

上一篇:07-SpringMVC核心之异常处理https://blog.csdn.net/fsjwin/article/details/109618746

拦截器

1. 拦截器是springmvc中的一种组件,需要实现HandlerInterceptor接口
2. 拦截器和过滤器类似,功能方向侧重不同,过滤器用来过滤请求,设置编码字符集等工作。拦截器是拦截用户请求,做请求做判断处理的。
3. 拦截器是全局的,可以是0个,1个,多个,他们一起拦截用户请求。
4. 拦截器主要用在登录处理,权限检查,记录日志等。

拦截器的使用步骤

1. 定义类实现HandlerIntercepter接口
2. 在springmvc中配置文件中,声明拦截器,让框架知道拦截器的存在。

拦截器的执行时间点

1. 在请处理之前,也就是controller类的方法执行之前被拦截。
2. 在控制器方法执行之后也会执行拦截器
3. 在请求处理完成后也会执行拦截器

1.自定义拦截器

package com.yuhl.handler;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.security.interfaces.RSAKey;

/**
 * @author yuhl
 * @Date 2020/11/11 19:50
 * @Classname MyIntercepter
 * @Description 自定义拦截器
 */
public class MyHandlerIntercepter implements HandlerInterceptor {
    /**
     * 需要掌握
     * 1. 方法在控制器controller执行之前执行
     * 2. 在这个方法中可以获取请求信息,验证请求信息是否符合要求,如果验证失败则返回false,如果验证成功则返回true。
     * 3. 这个是整个请求入口门户,超级重要就是门卫呀!!!!!!!!!!!!!!!!!!!!!!
     * @param request
     * @param response
     * @param handler 当前的controller对象
     * @return true:继续执行,false 拦截执行
     * @throws Exception
     */
/*    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyHandlerIntercepter.preHandle");
        request.getRequestDispatcher("/tips.jsp").forward(request, response);//返回false的时候给一个错误页面
        return false; //返回false就不会执行controller控制器的执行。
    }*/

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyHandlerIntercepter.preHandle");
        return true; //返回false就不会执行controller控制器的执行。
    }

    /**
     * 了解接口,在处理器方法执行之后执行,能的道ModelAndView,可以对他进行修改,偷梁换柱!!!!!二次修正。
     * @param request
     * @param response
     * @param handler 对拦截的处理器对象controller对象
     * @param modelAndView 返回的模型和视图返回值
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyHandlerIntercepter.postHandle");
        modelAndView.addObject("msg", "偷梁换柱了");
        modelAndView.setViewName("tips2");//偷梁换柱,修改了msg和最终视图tips2 (src\main\webapp\WEB-INF\view\tips2.jsp)
    }

    /**
     * 视图处理完成后执行
     * 比如执行了forwoard或者redirect,一般做资源回收工作的。
     * @param request
     * @param response
     * @param handler
     * @param ex 异常对象
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyHandlerIntercepter.afterCompletion");
    }
}

2.自定义拦截器方法preHandle

当返回true的时候,才会调用controller的对应方法,当返回false的时候可以给一个错误页面,提示用户:

 @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyHandlerIntercepter.preHandle");
        request.getRequestDispatcher("/tips.jsp").forward(request, response);//返回false的时候给一个错误页面
        return false; //返回false就不会执行controller控制器的执行。
    }

3.自定义拦截器方法postHandle

在controller的对应方法执行完成的时候调用的,可以对modelAndvie进行偷梁换柱的修改,不进可以修改msg,而且可以修改视图:

 @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyHandlerIntercepter.postHandle");
        modelAndView.addObject("msg", "偷梁换柱了");
        modelAndView.setViewName("tips2");//偷梁换柱,修改了msg和最终视图tips2 (src\main\webapp\WEB-INF\view\tips2.jsp)
    }

把msg修改为偷梁换柱了
把视图修改为/WEB-INF/view/tips2.jsp

4.自定义拦截器方法afterCompletion

forward等之后调用的方法一般做资源回收工作的

5.拦截器个方法的执行流程图下图

08-SpringMVC核心之一个拦截器

6.总结

由来拦截器我们可以对请求的关键节点进行手术刀式的处理,可以做到精细处理。

相关标签: springmvc 拦截器