springboot 实战:异常与重定向问题
作者:Yangkx-123 发布时间:2022-03-06 15:44:54
springboot 异常与重定向
在spring中,有两个重定向类型:
301,永久性跳转
302,暂时性跳转
默认调用302。
1.下面先通过一个简单的例子实现页面的重定向
@RequestMapping("/redirect/[code]")
public RedirectView redirectView(@PathVariable("code") int code,
HttpSession session){
RedirectView red = new RedirectView("/",true);
//判断是不是301异常
if (code == 301){
//默认为302转移,此处设置为永久性转移
red.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
}
return red;
}
结果:
无论是访问“redirect/301”还是“redirect/302”,结果都会跳转到首页,只是一个是301类型,一个是302类型。
2.通过一个更简单的方法实现重定向
@RequestMapping("/redirect/[code]")
public RedirectView redirectView(@PathVariable("code") int code,
HttpSession session){
//这种跳转都是302跳转,通过一个redirect前缀告诉请求,要跳转到首页
//所有的redirect请求都会跳转到首页
return "redirect:/";
}
结果:
这种方式重定向,都是通过302的方式进行的,无论“redirect”后面的url是什么,因为只要识别到redirect这个前缀,就会跳转到首页。
3.在重定向过程中,用session传递信息
1.重定向页面
@RequestMapping("/redirect/[code]")
public String redirectView(@PathVariable("code") int code,
HttpSession session){
//这种跳转都是302跳转,通过一个redirect前缀告诉请求,要跳转到首页
//所有的redirect请求都会跳转到首页
//通过session来传递信息
session.setAttribute("msg","Jump from redirect");
return "redirect:/";
}
2.首页
@RequestMapping("/")
@ResponseBody
public String index(HttpSession session){
//在首页中显示重定向中的session
return "Hello World!" + session.getAttribute("msg");
}
结果:
无论redirect后面的url是什么,都会返回首页,并显示相应的信息。
4.admin请求异常
@RequestMapping("/admin")
@ResponseBody
public String admin(@RequestParam("key") String key){
//如果key=“admin”
if ("admin".equals(key)){
return "hello admin";
}
//否则抛出异常
throw new IllegalArgumentException("Key Wrong!");
}
结果:
在“key=admin”的时候,返回相应信息;在“key!=admin”的时候,返回错误信息。
5.自己定义异常
@ExceptionHandler()
@ResponseBody
public String error(Exception e){
return "error:" + e.getMessage();
}
结果:
可以看出,在出现异常的时候,使我们自己定义的异常界面内容,和4中的不同。
springboot 异常统一处理
这里先对需要使用到的注解或者类进行说明,顺便理清楚条理。
@ExceptionHandler:注解使用在方法上,值为指定某个异常,当该方法所在的controller出现的异常与注解的异常对应,则会触发注解的方法。
下面这个controller一旦出现异常都会将异常捕获转给该方法进行处理
@RestController
@RequestMapping("user")
public class UserController {
@ExceptionHandler(value = Exception.class)
public void solveException(){
//异常处理逻辑
}
}
@controllerAdvice: 注解在类上,注解的类会注册到spring容器中,类中可有三种注解,@ExceptionHandler,@InitBinder,@ModelAttribute。该类下只要是注解上面三个注解的方法就是让把方法应用到程序中所有带有@RequesMapping注解的方法上。
流程 :
自定义一个自己的异常
声明带有@ControllerAdvice的类和@ExceptionHandler的方法,将@ExceptionHandler的方法应用到所有controller。
声明一个返回结果类
声明一个枚举类,用来包含可能出现的异常类型
Demo
自定义异常:
@Data
@AllArgsConstructor
public class MyException extends RuntimeException{
private Integer code;
private String msg;
public MyException(ResultEnum resultEnum){
this.msg = resultEnum.getMsg();
this.code = resultEnum.getCode();
}
}
自定义返回结果:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
private int code;
private String msg;
}
枚举类:
public enum ResultEnum {
UNKNOW_ERROR(-1,"未知错误"),
USER_ERROR(-2,"用户信息错误"),
SUCCESS(0,"成功");
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
//省略getter和setter
}
工具类:
public class ResultUtil {
public static Result error(Integer code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
自定义异常捕获类:
@ControllerAdvice
@Slf4j
public class MyExceptionHandler {
//接收的是Exception,也就是只要是异常都会执行这方法
@ExceptionHandler(value=Exception.class)
@ResponseBody
public Result handle(Exception e){
if(e instanceof MyException){
MyException myException = (MyException) e;
return ResultUtil.error(myException.getCode(),myException.getMsg());
}else{
return ResultUtil.error(-1,"未知错误");
}
}
}
controller类:
@RestController
@RequestMapping("user")
public class UserController {
@GetMapping("exception")
public void catchException() throws Exception{
throw new MyException(ResultEnum.USER_ERROR);
}
}
流程:
我们访问http://localhost:8080/user/exception来访问该方法,并抛出我们自定义的异常,通过枚举类来进行对异常信息的集合。
通过自定义的异常捕获类,来进行对异常的捕获,执行方法。
异常捕获类的方法中,通过ResultUtil工具类来进行生成Result对象返回。
来源:https://blog.csdn.net/yang_csdnForOBTS/article/details/81981185


猜你喜欢
- 加载本地图片在项目目录下创建assets文件夹,再在其文件夹下创建images文件夹,后面将需要的图片复制到其中即可在pubspec.yam
- springboot aop里的@Pointcut()的配置@Pointcut("execution(public * com.w
- 场景在任何一个Form表单的操作页面或者数据台账的查询页面,基本都会看到一个清除的按钮,其功能就是用来清除我们需要抛弃的已经写入到控件内的数
- 本文实例为大家分享了Unity实现弹球打砖块游戏的具体代码,供大家参考,具体内容如下创作界面记录摄像机所需脚本1射线shexianusing
- 下面通过代码看下springboot 跨域配置类,代码如下所示:ackage org.fh.config;import java.io.IO
- 本文主要带大家看看Object类中一些常用方法的API文档的介绍和JDK中的源码。1.equals方法1.API中equals方法的介绍2.
- 需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启、程序升
- 前不久,我们发布了《选择 .NET 的 n 个理由》。它提供了对平台的高层次概述,总结了各种组件和设计决策,并承诺对所涉及的领域发表更深入的
- 实时代码模板(Live Templates)我们先来看一个gif图:大兄弟,你看清我的操作了么?这个就是实时代码模板的功能。我们来看一下怎么
- 在游戏里面有很多模糊效果,像赛车类游戏。当你加速时,会发现2边的场景变模糊。如下图:今天也来做一下径向模糊效果,首先创建一个Material
- 简介Android给我们提供了一种轻量级的异步任务类AsyncTask。该类中实现异步操作,并提供接口反馈当前异步执行结果及进度,这些接口中
- 方式一:例如:”0000123” (字符串必须全为数字)处理过程:String tempStr = "0000123";
- 今天在线上发现一个问题,在使用Jackson进行时间的反序列化时,配置的 @JsonFormat 没有生效查看源码发现,Jackson在反序
- 这是android新推出的一个,让卡片带立体感的一个控件,就是一个卡牌,有点类似于布局那种的东西,里面可以添加控件内容先看看运行的效果图:1
- package com.smart.frame.task.autoTask;import java.util.Collection;impo
- 在开发的过程中,往往会需要在组件中添加一些按钮,用于执行一些自定义的操作。例如你有一个组件A,里面有一个List<Collider&g
- 本文实例为大家分享了Android实现支付宝支付密码输入界面的具体代码,供大家参考,具体内容如下效果图:主要代码:import java.u
- 前言:最近工作上遇到几个USB模块在android平台上适配使用的情况,所以要用到USB权限获取问题##USB权限获取有以下2种方式:一、直
- 一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项。我还记得很久以前我
- 目录前言一、介绍一下GradientDrawable二、实现三、源码:总结前言今天和朋友聊到这个功能,刚开始的想法是自定义view,如何进行