spring-mvc 系列:拦截器和异常处理器(HandlerInterceptor、HandlerExceptionResolver)
一、拦截器的配置
SpringMVC中的拦截器用于拦截控制器方法的执行
SpringMVC中的拦截器需要实现HandlerInterceptor
SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:
<bean class="com.mcode.api.interceptors.FirstInterceptor"/>
<ref bean="firstInterceptor"/>
<!-- 以上两种配置方式都是对DispatcherServlet所处理的所有的请求进行拦截 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/testRequestEntity"/>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>
<!--
以上配置方式可以通过ref或bean标签设置拦截器,通过mvc:mapping设置需要拦截的请求,通过
mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求
-->
java
package com.mcode.api.interceptors;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * ClassName: FirstInterceptor
 * Package: com.mcode.api.interceptors
 * Description:
 *
 * @Author robin
 * @Create 2023/8/9 22:20
 * @Version 1.0
 */
@Component
public class FirstInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("FirstInterceptor-->preHandle");
        return  true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("FirstInterceptor-->postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("FirstInterceptor-->afterCompletion");
    }
}
二、拦截器的三个抽象方法
preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
postHandle:控制器方法执行之后执行postHandle()
afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
三、多个拦截器的执行顺序
a>若每个拦截器的preHandle()都返回true
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:
preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行
b>若某个拦截器的preHandle()返回了false
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false
的拦截器之前的拦截器的afterComplation()会执行
四、基于配置的异常处理器
SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver
HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver
SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:
spring-mvc.xml
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--
                 properties的键表示处理器方法执行过程中出现的异常
                 properties的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
                 -->
                <prop key="java.lang.ArithmeticException">error</prop>
            </props>
        </property>
        <!--
         exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享
         -->
        <property name="exceptionAttribute" value="ex"/>
     </bean>
java
    @RequestMapping("/testExceptionHandler")
    public String testExceptionHandler(){
        System.out.println(1/0);
        return "success";
    }
error.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>错误页</title>
</head>
<body>
出现错误
<p th:text="${ex}"></p>
</body>
</html>
五、基于注解的异常处理器
package com.mcode.api.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
 * ClassName: ExceptionController
 * Package: com.mcode.api.controller
 * Description:
 *
 * @Author robin
 * @Create 2023/8/9 22:59
 * @Version 1.0
 */
//@ControllerAdvice将当前类标识为异常处理的组件
//@ControllerAdvice继承了@Controller,所以会被扫描
@ControllerAdvice
public class ExceptionController {
    /**
     * @param ex
     * @param model
     * @return
     * @ExceptionHandler用于设置所标识方法处理的异常 ex表示当前请求处理中出现的异常对象
     */
    @ExceptionHandler({RuntimeException.class, ArithmeticException.class})
    public String handleException(Exception ex, Model model) {
        model.addAttribute("ex", ex);
        return "error";
    }
}
												
											spring-mvc 系列:拦截器和异常处理器(HandlerInterceptor、HandlerExceptionResolver)的更多相关文章
- spring mvc +cookie+拦截器功能 实现系统自动登陆
		
先看看我遇到的问题: @ResponseBody @RequestMapping("/logout") public Json logout(HttpSession session ...
 - Spring mvc登录拦截器
		
自己实现的第一个Spring mvc登录拦截器 题目要求:拒绝未登录用户进入系统,只要发现用户未登录,则将用户请求转发到/login.do要求用户登录 实现步骤: 1.在spring的配置文件中添加登 ...
 - 玩转spring MVC(七)----拦截器
		
继续在前边的基础上来学习spring MVC中拦截器的使用,下面通过一个例子来实现(完整项目在这里下载:http://download.csdn.net/detail/u012116457/84334 ...
 - java之spring mvc之拦截器
		
1. springmvc 中的拦截器是由实现 HandlerInterceptor 或者继承 HandlerInterceptorAdapter 来实现的. 2. 自定义实现一个拦截器的步骤: a). ...
 - 基于Spring MVC 实现拦截器
		
Spring MVC 拦截器 一,具体内容: 在所有的开发之中拦截器属于一个重要的组件,可以说几乎所有的项目都会提供的概念应用,不管是Spring MVC,还是Struts 2.x都是提供有拦截器的, ...
 - 【SpringMVC】文件上传与下载、拦截器、异常处理器
		
文件下载 使用ResponseEntity实现下载文件的功能 index.html <!DOCTYPE html> <html lang="en" xmlns:t ...
 - [Spring MVC] - Interceptor 拦截器
		
Spring MVC中的Interceptor与Struts2的差不多. 下面是一个简单的Interceptor登陆验证例子: 1.需要在spring的配置文件中加入这段: <!-- 自定义拦截 ...
 - spring mvc 配置文件拦截器过滤url
		
最近在用spring mvc拦截器,sprin 版本号4.0.6.RELEASE, <mvc:interceptor> <mvc:mapping path="/admin/ ...
 - Spring MVC 使用拦截器优雅地实现权限验证功能
		
在上一篇 SpringAOP 实现功能权限校验功能 中虽然用AOP通过抛异常,请求转发等勉强地实现了权限验证功能,但感觉不是那么完美,应该用拦截器来实现才是最佳的,因为拦截器就是用来拦截请求的,在请求 ...
 - Spring MVC定义拦截器
		
拦截器: package sy.Interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http ...
 
随机推荐
- JavaCore extends Plugin
			
/******************************************************************************* 2 * Copyright (c) 2 ...
 - SaaS模式相较传统CRM系统有何优势?
			
SaaS模式的CRM客户管理系统相较于传统的CRM客户管理系统更加方便灵活,更加符合如今的市场环境.它解决了传统CRM系统投入大.维护难的难题,降低了中小企业导入CRM的门槛.下面详细说说SaaS模式 ...
 - js下IE和FF的一些兼容写法总结
			
一.脚本差异: 1.事件绑定:addEventListener 与 attachEvent 事件处理函数中this指向不同, IE中指向window 2.获取事件对象 :事件处理函数 win ...
 - ELK-日志收集-Kibana WEB安全认证
			
1.ELK收集MYSQL日志实战: 日志收集存放目录位置: /usr/local/logstash/config/etc/ 1)日志采集-存入redis缓存数据库:mysql-redis.conf ...
 - c# 光学三原色混合,颜色叠加-dong
			
东的备注: 光的三原色:红.绿.蓝 红+绿=黄 红+蓝=品红 蓝+绿=青 红+绿+蓝=白 无颜色为黑 下看代码 Bitmap image1 = new Bitmap(500, 500);//红 Bit ...
 - Acwing76场周赛
			
题目链接 这次还是只做出来两道题,前两题都挺简单的,注意第二题需要开long long不开会wa,代码粘上来,以后可能会看吧 第一题 #include<iostream> #include ...
 - 使用 Hexo 搭建个人博客并部署到云服务器
			
目录 1 整体流程 2. 本地环境准备 2.1 安装 Node.js 和 Git 2.2 安装 Hexo 3. 服务端环境准备 3.1 Nginx 环境配置 3.1.1 安装 Nginx 3.1.2 ...
 - React 应用构建(环境)
			
可以少去理解一些不必要的概念,而多去思考为什么会有这样的东西,它解决了什么问题,或者它的运行机制是什么? 一. 环境搭建 工作编辑器:Visual Studio Code. Javascript 解析 ...
 - 如何保证Spring Boot接口安全的呢?
			
在保证Spring Boot接口安全时,我们需要关注的主要方面包括:认证(Authentication).授权(Authorization).数据安全性(Data Security).以及防止常见的W ...
 - logstash 配置文件语法介绍
			
大家好,我是蓝胖子,之前在构建服务监控实践那个系列里,有提到用logstash来做日志的收集,但是对于logstash的配置文件语法没有做很详细的介绍,今天就来详细聊聊logstash配置文件的语法. ...