springboot 实战:异常与重定向问题

目录
  • springboot 异常与重定向
    • 1.下面先通过一个简单的例子实现页面的重定向
    • 2.通过一个更简单的方法实现重定向
    • 3.在重定向过程中,用session传递信息
    • 4.admin请求异常
    • 5.自己定义异常
  • springboot 异常统一处理
    • Demo

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对象返回。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用springboot跳转到指定页面和(重定向,请求转发的实例)

    目录 springboot跳转到指定页面 controller的写法 springboot重定向和请求转发 springboot重定向 springboot的请求转发 springboot转发和重定向 springmvc重定向写法 转发的特点 重定向的特点 springboot跳转到指定页面 controller的写法 必须是templates下面的页面,不经过配置,无法直接跳转到public,static,等目录下的页面 package com.ljf.spring.boot.demo.con

  • springboot 如何重定向redirect 并隐藏参数

    目录 springboot 重定向redirect 并隐藏参数 1.全局异常处理方法 2.重定向方法 springboot redirect 传参问题 具体案例 springboot 重定向redirect 并隐藏参数 在做全局异常处理的时候,碰到重定向到全局错误页面 所谓隐藏参数无非是把参数放到了session中,再重定向后将该值清除 1.全局异常处理方法 @ExceptionHandler(value = Exception.class) public ModelAndView except

  • Springboot转发重定向实现方式解析

    1.转发 方式一:使用 "forword" 关键字(不是指java关键字),注意:类的注解不能使用@RestController 要用@Controller @RequestMapping(value="/test/test01/{name}" , method = RequestMethod.GET) public String test(@PathVariable String name) { return "forword:/ceng/hello.h

  • 基于springboot redirect重定向路径问题总结

    目录 SpringMVC重定向视图RedirectView小分析 前言 实例讲解 Controller代码 我们通过firebug看下路径: 总结 SpringMVC重定向视图RedirectView小分析 前言 SpringMVC是目前主流的Web MVC框架之一. 本文所讲的部分内容跟SpringMVC的视图机制有关,SpringMVC的视图机制请参考楼主的另一篇博客: RedirectView这个视图是跟重定向相关的,也是重定向问题的核心,我们来看看这个类的源码. 路径构造完毕之后使用re

  • springboot项目拦截器重定向循环问题的解决

    目录 springboot项目拦截器重定向循环 解决办法 springboot拦截器无限循环报错 springboot项目拦截器重定向循环 本菜鸟很久没写东西了,这回是解决了一个小问题,希望能帮助到你. 最近写了一个项目,项目中写了登录拦截器,session过期的用户请求会重定向到登录页面. 写完测试发现session过期后浏览器一直提示重定向次数过多. 打开浏览器F12看到一直都在访问/login/login/login之类的无限循环路径. 后来经过网上查询发现我之前设置重定向地址时直接设置的

  • springboot 重定向方式(redirect前缀)

    目录 springboot 重定向(redirect前缀) 相关注解 示例 Spring 重定向(Redirect)指南 为什么要重定向? 使用 RedirectView 重定向 结论 springboot 重定向(redirect前缀) 相关注解 @ModelAttribute:读取modelAndView中的数据 @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @

  • springboot如何重定向携带数据 RedirectAttributes

    目录 当controller层需要重定向到指定页面时,如何携带数据? RedirectAttributes的使用 RedirectAttributes存值后读取不到 当controller层需要重定向到指定页面时,如何携带数据? 传统使用session 使用RedirectAttributes. (利用session原理) 优点:提供了addFlashAttribute 等方法.确保数据只能被使用一次后删除 RedirectAttributes的使用 public interface Redir

  • springboot 实战:异常与重定向问题

    目录 springboot 异常与重定向 1.下面先通过一个简单的例子实现页面的重定向 2.通过一个更简单的方法实现重定向 3.在重定向过程中,用session传递信息 4.admin请求异常 5.自己定义异常 springboot 异常统一处理 Demo springboot 异常与重定向 在spring中,有两个重定向类型: 301,永久性跳转 302,暂时性跳转 默认调用302. 1.下面先通过一个简单的例子实现页面的重定向 @RequestMapping("/redirect/[code

  • SpringBoot实战之处理异常案例详解

    前段时间写了一篇关于实现统一响应信息的博文,根据文中实战操作,能够解决正常响应的一致性,但想要实现优雅响应,还需要优雅的处理异常响应,所以有了这篇内容. 作为后台服务,能够正确的处理程序抛出的异常,并返回友好的异常信息是非常重要的,毕竟我们大部分代码都是为了 处理异常情况.而且,统一的异常响应,有助于客户端理解服务端响应,并作出正确处理,而且能够提升接口的服务质量. SpringBoot提供了异常的响应,可以通过/error请求查看效果: 这是从浏览器打开的场景,也就是请求头不包括content

  • SpringBoot实战之高效使用枚举参数(原理篇)案例详解

    找入口 对 Spring 有一定基础的同学一定知道,请求入口是DispatcherServlet,所有的请求最终都会落到doDispatch方法中的ha.handle(processedRequest, response, mappedHandler.getHandler())逻辑.我们从这里出发,一层一层向里扒. 跟着代码深入,我们会找到org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest的

  • SpringBoot实战之实现结果的优雅响应案例详解

    今天说一下 Spring Boot 如何实现优雅的数据响应:统一的结果响应格式.简单的数据封装. 前提 无论系统规模大小,大部分 Spring Boot 项目是提供 Restful + json 接口,供前端或其他服务调用,格式统一规范,是程序猿彼此善待彼此的象征,也是减少联调挨骂的基本保障. 通常响应结果中需要包含业务状态码.响应描述.响应时间戳.响应内容,比如: { "code": 200, "desc": "查询成功", "tim

  • SpringBoot逻辑异常统一处理方法

    这篇文章主要介绍了SpringBoot逻辑异常统一处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 构建项目 我们将逻辑异常核心处理部分提取出来作为单独的jar供其他模块引用,创建项目在parent项目pom.xml添加公共使用的依赖,配置内容如下所示: <dependencies> <!--Lombok--> <dependency> <groupId>org.projectlombok</g

  • Springboot处理异常的常见方式

    一.制造异常 报500错误.在大量的代码中很难找到错误 二.统一异常处理 添加异常处理方法 GlobalExceptionHandler.java中添加 //指定出现什么异常执行这个方法 @ExceptionHandler(Exception.class) @ResponseBody //为了返回数据 public R error(Exception e) { e.printStackTrace(); return R.error().message("执行了全局异常处理.."); }

  • SpringBoot实战项目之谷歌浏览器全屏效果实现

    项目场景: 客户需求文档中,要求在Win10系统下须使用Chrome谷歌浏览器展示页面,但高层相关方希望页面展示时可以实现全屏效果以提高用户体验. 对于谷歌浏览器的全屏功能来说,前端的实现已经不行了,之前谷歌浏览器基于安全的考虑封禁了任何调用全屏的事件(必须用户手势user gesture),有尝试过捕获用户手势触发点击事件的参数,但捕获到后发现事件参数太多(密密麻麻的ε=ε=ε=ε=ε=ε=┌(; ̄◇ ̄)┘),模拟起来太费劲会浪费太多时间(还是算了吧 ╮(๑•́ ₃•̀๑)╭). 由于Chro

  • SpringBoot实战教程之新手入门篇

    目录 1.SpringBoot简介 2.SpringBoot安装 2.1.基于Maven的安装 2.2.基于Gradle的安装 3.创建HelloWorld应用 4.代码结构 5.Configuration类 5.1.导入其它配置 6.自动化配置 6.1.逐渐替换自动化配置 6.2.禁止特定的自动化配置 7.使用@SpringBootApplication注解 总结 1. SpringBoot 简介 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spri

  • SpringBoot实战记录之数据访问

    目录 前言 SpringBoot整合MyBatis 环境搭建 注解方式整合mybatis 使用xml配置Mybatis 整合Redis 接口整合 测试 总结 前言 在开发中我们通常会对数据库的数据进行操作,SpringBoot对关系性和非关系型数据库的访问操作都提供了非常好的整合支持.SpringData是spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞状项目,包含大量关系型和非关系型数据库数据访问解决方案,让我们快速简单的使用各种数据访问技术,springboot默认

  • springboot实战权限管理功能图文步骤附含源码

    目录 前言 功能清单 功能介绍 菜单管理 资源管理 角色管理 后台用户管理 动态菜单控制 动态资源控制 项目源码地址 前言 mall项目的权限管理功能发布啦!权限管理作为后台管理系统的必要功能,mall项目之前的权限管理并不完善.最近我对原先的权限管理进行了重新设计,打造了一套切实可用的权限管理功能. 功能清单 菜单管理:可以实现对后台管理系统左侧菜单的管理,支持更换图标.更换名称.控制菜单显示和排序: 资源管理:实现了基于访问路径的后台动态权限控制,控制的权限可以精确到接口级别: 角色管理:可

随机推荐