SSM

Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理

Nick · 4月11日 · 2020年 · 本文4044字 · 阅读11分钟645

SpringMVC框架中的拦截器

1. 拦截器的概述

  1. SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
  2. 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链
    中的拦截器会按着定义的顺序执行。
  3. 拦截器和过滤器的功能比较类似,有区别
    1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
    2. 拦截器是SpringMVC框架独有的。
    3. 过滤器配置了/*,可以拦截任何资源。
    4. 拦截器只会对控制器中的方法进行拦截。
  4. 拦截器也是AOP思想的一种实现方式
  5. 想要自定义拦截器,需要实现HandlerInterceptor接口。
    在这里插入图片描述

2. HandlerInterceptor接口中的方法

  1. preHandle方法是controller方法执行前拦截的方法
    1. 可以使用request或者response跳转到指定的页面
    2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
    3. return false不放行,不会执行controller中的方法。
  2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。
    1. 可以使用request或者response跳转到指定的页面
    2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
  3. postHandle方法是在JSP执行后执行
    1. request或者response不能再跳转页面了

3. 自定义拦截器

创建类,实现HandlerInterceptor接口,重写需要的方法

package cn.kt.Interceptor;/*
 *Created by tao on 2020-04-11.
 */

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/*
 * 自定义拦截器案例
 * */
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 预处理,controller方法执行前
     * return false不放行
     * return true 放行,执行下一个拦截器
     *
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("111拦截器执行了...前");
        return true;
    }

    /**
     * 后执行方法,在controller执行之后执行
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("111后执行方法执行了,,,后");
    }

    /**
     * 最后执行方法,在页面跳转完之后执行
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("111最后执行的方法执行了,,,最后");
    }


}

在springmvc.xml中配置拦截器类

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 哪些方法进行拦截 -->
            <mvc:mapping path="/ipc/**"/>
            <!-- 哪些方法不进行拦截
            <mvc:exclude-mapping path=""/>
            -->
            <!-- 注册拦截器对象 -->
            <bean class="cn.kt.Interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

注意:配置多个拦截器需要在springmvc.xml在建一个<mvc:interceptors>,当设置多个拦截器后,执行的顺序如下:
在这里插入图片描述

SpringMVC的异常处理

1. 异常处理思路

  1. Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理
    在这里插入图片描述

2. SpringMVC的异常处理

  1. 自定义异常类
package cn.kt.exception;/*
 *Created by tao on 2020-04-11.
 */
/*
* 自定义异常类
* */
public class SysException extends Exception{
    private static final long serialVersionUID = 4055945147128016300L;
    // 异常提示信息
    private String message;
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public SysException(String message) {
        this.message = message;
    }
}
  1. 异常测试控制器
package cn.kt.controller;/*
 *Created by tao on 2020-04-11.
 */

import cn.kt.exception.SysException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/exc")
public class ExceptionController {

    @RequestMapping("/testException")
    public  String testException() throws SysException {
        System.out.println("testException方法执行了,,,");
        try {
            //模拟异常
            int a= 1/0;
        } catch (Exception e) {
            //控制台打印异常
            e.printStackTrace();
            //抛出自定义异常
            throw new SysException("testException出现错误");
        }
        return "success";
    }
}
  1. 自定义异常处理器
package cn.kt.exception;/*
 *Created by tao on 2020-04-11.
 */

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 异常处理器
 *
 * @author rt
 */
public class SysExceptionResolver implements HandlerExceptionResolver {
    /**
     * 处理异常的业务逻辑
     * 跳转到具体的错误页面的方法
     */
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ex.printStackTrace();
        SysException e = null;
        // 获取到异常对象
        if (ex instanceof SysException) {
            e = (SysException) ex;
        } else {
            e = new SysException("系统正在维护");
        }
        ModelAndView mv = new ModelAndView();
        // 存入错误的提示信息
        mv.addObject("errorMsg", e.getMessage());
        // 跳转的Jsp页面
        mv.setViewName("error");
        return mv;
    }
}
  1. 配置异常处理器
 <!-- 配置异常处理器 -->
    <bean id="sysExceptionResolver" class="cn.kt.exception.SysExceptionResolver"/>

结果如下
* 当设置的接收异常后
抛出的页面是接收异常后的信息
Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客
Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客
* 当出现其他异常时,没有被接收时,一律这样处理
Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客
在这里插入图片描述

0 条回应
在线人数:1人 来访统计
隐藏