014-Spring Boot web【三】拦截器HandlerInterceptor、异常处理页面,全局异常处理ControllerAdvice

时间:2022-08-30 13:39:17

一、拦截器HandlerInterceptor

1.1、HandlerInterceptor接口说明

  preHandle,congtroller执行前,如果返回false请求终端

  postHandle,controller执行之后,页面渲染前

  afterCompletion,整个请求结束后,页面也渲染完毕,一般是资源清理操作

  同时提供异步拦截器AsyncHandlerInterceptor

1.2、拦截器使用步骤

  1》写一个拦截器,实现HandlerInterceptor 接口

  2》写一个类,继承WebMvcConfigurerAdapter抽象类,然后重写addInterceptors方法,把上一步的拦截器加入registry.addInterceptor(new LogHandlerInterceptor());

1.3、示例

  启动类

package com.lhx.spring.springboot_web;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

  建立UserController

package com.lhx.spring.springboot_web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping; @Controller
public class UserController { @GetMapping(value = "/user/home")
public String home() {
System.out.println("--------user home--------");
return "user home";
}
}

  增加拦截器LogHandlerInterceptor

package com.lhx.spring.springboot_web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; public class LogHandlerInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("----------preHandle----------"+handler.getClass()); return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("----------postHandle----------"); } @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("----------afterCompletion----------"); } }

  增加配置类WebConfiguration

package com.lhx.spring.springboot_web;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @SpringBootConfiguration
public class WebConfiguration extends WebMvcConfigurerAdapter { @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogHandlerInterceptor());
} }

二、异常处理

2.1、编码抛出异常代码

    @GetMapping(value = "/user/help")
@ResponseBody
public String help() {
throw new IllegalArgumentException("args is empty");
}

2.2、分析代码

  查看:org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,发现默认已经被springboot定制。

  去除springboot默认异常显示,只需在启动类添加:@SpringBootApplication(exclude=ErrorMvcAutoConfiguration.class)即可。则返回错误就会变成Tomcat提供的

2.3、添加自定义错误页

  1》去除springboot默认的:@SpringBootApplication(exclude=ErrorMvcAutoConfiguration.class)

  2》在src/main/resources下增加public,在pulic中增加404.html,500.html

  3》增加CommonErrorPageRegistry实现ErrorPageRegistrar增加@Component注解,可以针对错误码处理或者具体异常处理

package com.lhx.spring.springboot_web;

import org.springframework.boot.web.servlet.ErrorPage;
import org.springframework.boot.web.servlet.ErrorPageRegistrar;
import org.springframework.boot.web.servlet.ErrorPageRegistry;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component; @Component
public class CommonErrorPageRegistry implements ErrorPageRegistrar { @Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage e404 = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");
ErrorPage e500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html");
ErrorPage args = new ErrorPage(IllegalArgumentException.class, "/args.html");
registry.addErrorPages(e404);
registry.addErrorPages(e500);
registry.addErrorPages(args);
} }

    以上将404,500逻辑添加

三、全局异常处理

3.1、局部异常处理

  当前Controller使用,可以在当前Controller中使用ExceptionHandler注解

如下代码

package com.lhx.spring.springboot_web;

import java.io.FileNotFoundException;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class BookController { @ExceptionHandler(value = Exception.class)
public String error(Exception e) {
return "fount exception:"+e.getMessage();
} @GetMapping("book/error1")
public String error1() throws FileNotFoundException {
throw new FileNotFoundException("book not found");
}
@GetMapping("book/error2")
public String error2() throws ClassNotFoundException {
throw new ClassNotFoundException("class not found");
}
}

  其中:@ExceptionHandler(value = Exception.class) 代表所有;也可指代具体异常,如文件没有发现@ExceptionHandler(value = FileNotException.class)

3.2、全局异常处理

  1》写一个GlobalExceptionHandler异常处理类,并且使用@ControllerAdvice注解

  2》写一个方法,需要添加@ExceptionHandler(value = Exception.class)注解,在方法中编写具体代码逻辑

package com.lhx.spring.springboot_web;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice
public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class)
@ResponseBody
public String errorHandler(Exception e) {
return "global error:" + e.getClass().getName();
}
}

  可以有多个不同的异常处理。

3.3、就近原则

  局部异常优先级高于全局异常处理

一个比较通用的写法

@ControllerAdvice
@ResponseBody
public class ResponseExceptionHandler {
Logger logger=LoggerFactory.getLogger(ResponseExceptionHandler.class); @ExceptionHandler(ResponseException.class)
public ResponseEntity<ResponseResult> handleException(Exception e) {
logger.error("请求异常信息",e);
ResponseException cex = (ResponseException) e;
return new ResponseEntity(ResponseResult.error(cex.getResponseCode()), HttpStatus.OK);
} }

014-Spring Boot web【三】拦截器HandlerInterceptor、异常处理页面,全局异常处理ControllerAdvice的更多相关文章

  1. spring boot中注册拦截器

    拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重 ...

  2. spring boot 实现mybatis拦截器

    spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...

  3. spring boot 过滤器、拦截器的区别与使用

    原文:https://blog.csdn.net/heweimingming/article/details/79993591 拦截器与过滤器的区别: 1.过滤器和拦截器触发时机不一样,过滤器是在请求 ...

  4. Spring Boot实战:拦截器与过滤器

    一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...

  5. Spring Boot 如何使用拦截器、过滤器、监听器?

    过滤器 过滤器的英文名称为 Filter, 是 Servlet 技术中最实用的技术. 如同它的名字一样,过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作 ...

  6. 【Spring】7、拦截器HandlerInterceptor

    处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   常见 ...

  7. 【Spring Boot】Spring Boot之自定义拦截器

    一.拦截器的作用 将通用的代码抽取出来,达到复用的效果.比如可以用来做日志记录.登录判断.权限校验等等 二.如何实现自定义拦截器 1)创建自定义拦截器类并实现HandlerInterceptor类 / ...

  8. Spring boot实现自定义拦截器

    Sprintboot的拦截器提供了精细的控制:在request被响应之前.request被响应之后.request全部结束之后至视图渲染之前 三个时间点,我们都可以通过编写他们的函数来控制. 首先新建 ...

  9. spring boot配置springMVC拦截器

    spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...

  10. Spring Boot下使用拦截器

    Spring Boot对于原来在配置文件配置的内容,现在全部体现在一个类中,该类需要继承自WebMvcConfigurationSupport类,并使用@Configuration进行注解,表示该类为 ...

随机推荐

  1. &lbrack;C&sol;C&plus;&plus;&rsqb; C&sol;C&plus;&plus;延伸学习系列之STL及Boost库概述

    想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...

  2. 数据结构 B-树和B&plus;树的应用:数据搜索和数据库索引

    B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点 ...

  3. python 注册

    1.打开网址,点击 获得注册码 http://idea.qinxi1992.cn/  2.help -- register 第二步: http://jetbrains.tencent.click/   ...

  4. JAVA 方法重载

    方法的重载是指:一个类中可以定义有相同的名字,但参数不同的多个方法,调用时会根据不同的参数列表选择对应的方法. 实例: W.java public class W{ public void F(Str ...

  5. Oracle中的for语句

    for语句是一个可预置循环次数的循环控制语句,他是一个循环计数器,通常是一个整形变量,通过这个循环计数器来控制循环执行的次数 语法如下: for variable_counter_name in [e ...

  6. Azure HDInsight与Hadoop周边系统集成

     Sunwei 9 Dec 2014 1:54 AM 传统的Hadoop系统提供给用户2个非常优秀的框架,MR计算框架和HDFS存储框架,尽管MR已经显得有些老迈而缓慢,但是HDFS还是很多应用系统的 ...

  7. COJN 0483 800501求最大非空子矩阵

    800501求最大非空子矩阵 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩 ...

  8. 根据当前登录域账号 获取AD用户姓名和所在OU目录

    #region 根据当前登录域账号 获取AD用户姓名和所在OU目录 /// <summary> /// 根据当前登录域账号 获取AD用户姓名和所在OU目录 返回域用户是否存在 /// &l ...

  9. linux awk命令详解2

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F ...

  10. Web安全之CSP

    内容安全策略(Content-Security-Policy,简称CSP) 概念: 内容安全策略(CSP)是一种web应用技术用于帮助缓解大部分类型的内容注入攻击,包括XSS攻击和数据注入等,这些攻击 ...