前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理

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

作者头像
不愿意做鱼的小鲸鱼
发布2022-09-24 09:57:18
4090
发布2022-09-24 09:57:18
举报
文章被收录于专栏:web全栈web全栈

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接口,重写需要的方法
代码语言:javascript
复制
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中配置拦截器类
代码语言:javascript
复制
<!--配置拦截器-->
    <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. 自定义异常类
代码语言:javascript
复制
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. 异常测试控制器
代码语言:javascript
复制
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. 自定义异常处理器
代码语言:javascript
复制
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. 配置异常处理器
代码语言:javascript
复制
 <!-- 配置异常处理器 -->
    <bean id="sysExceptionResolver" class="cn.kt.exception.SysExceptionResolver"/>

结果如下 * 当设置的接收异常后 抛出的页面是接收异常后的信息

Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客
Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客
Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客
Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客

* 当出现其他异常时,没有被接收时,一律这样处理

Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客
Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理-左眼会陪右眼哭の博客
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringMVC框架中的拦截器
    • 1. 拦截器的概述
      • 2. HandlerInterceptor接口中的方法
        • 3. 自定义拦截器
          • 创建类,实现HandlerInterceptor接口,重写需要的方法
          • 在springmvc.xml中配置拦截器类
      • SpringMVC的异常处理
        • 1. 异常处理思路
          • 2. SpringMVC的异常处理
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档