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

Java Spring MVC 框架:(九)拦截器的使用

程序员文章站 2022-07-09 19:52:41
...

1.理解示意图

蓝色为拦截器,很直观…蓝=拦,手动滑稽
Java Spring MVC 框架:(九)拦截器的使用

2.内容原理

使用 SpringMVC 的拦截器:

原理:

  • 在 Servlet 和控制器单元方法之间进行拦截

使用:

  • 创建拦截器类,创建一个实现了 HandlerInterceptor 接口的 java 类
  • 并复写方法preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)

作用:

  • 拦截单元方法,返回值为 false 则拦截,返回值为 true 则放行

参数:

  • HttpServletRequest arg0,拦截的请求的 request 对象
  • HttpServletResponse arg1, 拦截的请求的 response 对象
  • Object arg2 封存了单元方法对象的 HandleMethod 对象postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
  • HttpServletRequest arg0, 拦截的请求的 request 对象
  • HttpServletResponse arg1, 拦截的请求的 response 对象
  • Object arg2, 封存了单元方法对象的 HandleMethod 对象
  • ModelAndView arg3 封存了单元方法的返回值资源路径和请 求转到的 Map 数据afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
  • HttpServletRequest arg0, 拦截的请求的 request 对象
  • HttpServletResponse arg1, 拦截的请求的 response 对象
  • Object arg2, 封存了单元方法对象的 HandleMethod 对象
  • Exception arg3 存储了责任链的异常信息

注意:

  • 拦截器的方法执行顺序
  • preHandle—>单元方法—>postHandle—>afterCompletion

3.代码实现

package com.interceptor;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

public class MyInter implements HandlerInterceptor {

    /**
     * 执行的时机: 在进入控制单元方法之前
     * <p>
     * 这个方法的返回值决定了是否继续执行控制单元的方法
     * <p>
     * 返回值是true --就进入控制单元继续执行
     * <p>
     * 返回值是false--就不会继续执行
     * <p>
     * o--即将执行控制单元中方法对象
     */
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object o) throws Exception {
        //作用一:进行中文乱码的处理
        // req.setCharacterEncoding("utf-8");
        //作用二:进行页面的拦截
        //resp.sendRedirect("/ssm_login/wh.jsp");
        //System.out.println("preHandle"+o);
        return true;
    }

    /**
     * 执行的时机:在进行数据处理之后
     * <p>
     * o:控制单元方法
     * <p>
     * modelAndView:视图模型对象
     */
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        //作用一: 用于控制单元中模块的测试
        //modelAndView.setViewName("redirect:/success2.jsp");
        //System.out.println("postHandle");
        //作用二:恶意字符的替换
        //【A】获得map集合中的内容 
        Map<String, Object> map = modelAndView.getModel();
        //登陆失败枪支
        String msg = (String) map.get("msg");
        if (msg.contains("枪支")) {
            // 登陆失败**
            String all = msg.replaceAll("枪支", "**");
            map.put("msg", all);
        }
    }

    /**
     * 执行时机:在进行页面渲染的时候执行
     * <p>
     * 主要就是页面渲染操作和最后的垃圾回收
     */
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion");
    }
}