springboot结合全局异常处理之登录注册验证

在学校做一个校企合作项目,注册登录这一块需要对注册登录进行输入合法的服务器端验证,因为是前后端分离开发,所以要求返回JSON数据。
方法有很多,这觉得用全局异常处理比较容易上手

全局异常处理

首先来创建一个sprIngboot的web项目或模块,目录结构如下


实体类User.java

@Data
public class User {
    private String userName;
    private String passwold;
}

实体类UserResult.java 把数据封装到这里返回到客户端

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserResult {
    private int code;
    private String msg;
}

接下来自定义异常,都继承自Exception

UserNullException.java 当用户名为空抛出这个异常

public class UserNullException extends Exception{

    public UserNullException() {
        super("用户名不能为空");
    }
}

PasswoldNullException.java 当密码为空抛出这个异常

public class PasswoldNullException extends Exception {
    public PasswoldNullException() {
        super("密码不能为空");
    }
}

UserNamePasswordNullException.java 当用户名和密码都为空抛出这个异常

public class UserNamePasswordNullException extends Exception {
    public UserNamePasswordNullException() {
        super("请输入用户名和密码");
    }
}

UserNameValidationException.jva 当输入不符合要求的用户名时抛出此异常

public class UserNameValidationException extends Exception{
    public UserNameValidationException() {
        super("请输入6到16位的数字或字母组合");
    }
}

UserNamePasswordNullException.java 当输入的密码不符合要求时抛出这个异常

public class UserNamePasswordNullException extends Exception {
    public UserNamePasswordNullException() {
        super("请输入用户名和密码");
    }
}

通过注解的方式捕获异常

  • @Controller + @ExceptionHandler
  • @ControllerAdvice + @ExceptionHandler

若返回的不是页面,把@Controller换成@RestController,@ControllerAdvice换成@RestControllerAdvice,也可以在@Controller类下的方法那里加上@ResponseBody

@Controller + @ExceptionHandler

@Controller:注解此类是Controller类
@ExceptionHandler:此注解注解到类的方法上,当此注解里定义的异常抛出时,此方法会被执行。如果@ExceptionHandler所在的类是@Controller,则此方法只作用在此类。如果@ExceptionHandler所在的类是@ControllerAdvice,则此方法会作用在全局

在这里我只进行了全局异常的捕获,就是只用了@RestControllerAdvice,对全部controller层进行了异常监控,任何控制层抛出常,只要@RestControllerAdvice类下@ExceptionHandler注解的value值指定有的都会被执行

@RestControllerAdvice
public class UserExceptionHandler {

    @ExceptionHandler(value = UserNullException.class)
    public  @ResponseBody UserResult userNull(HttpServletRequest request,Exception ex)
    {
        UserResult userResult=new UserResult();
        userResult.setCode(9);
        userResult.setMsg(ex.getMessage());
        return userResult;
    }
    @ExceptionHandler(value = PasswoldNullException.class)
    public   UserResult passwordNull(HttpServletRequest request,Exception ex)
    {
        UserResult userResult=new UserResult();
        userResult.setCode(10);
        userResult.setMsg(ex.getMessage());
        return userResult;
    }
    @ExceptionHandler(value = UserNamePasswordNullException.class)
    public  @ResponseBody UserResult namePassNull(HttpServletRequest request,Exception ex)
    {
        UserResult userResult=new UserResult();
        userResult.setCode(11);
        userResult.setMsg(ex.getMessage());
        return userResult;
    }
    @ExceptionHandler(value = UserNameValidationException.class)
    public  @ResponseBody UserResult UserNameValidation(HttpServletRequest request,Exception ex)
    {
        UserResult userResult=new UserResult();
        userResult.setCode(12);
        userResult.setMsg(ex.getMessage());
        return userResult;
    }
    @ExceptionHandler(value = PasswordValidationException.class)
    public  @ResponseBody UserResult  PasswordValidation(HttpServletRequest request,Exception ex)
    {
        UserResult userResult=new UserResult();
        userResult.setCode(13);
        userResult.setMsg(ex.getMessage());
        return userResult;
    }
}

在这里SignInController.java是全局异常捕获类

@RestControllerAdvice
@RequestMapping(value = "user/api")
public class SignInController {

    @PostMapping(value = "/sign_in")
    public UserResult signIn(@RequestBody User user) throws Exception {
        if (user.getUserName()==null&&user.getPasswold()==null)
        {
            throw new UserNamePasswordNullException();
        }else if (user.getUserName()==null)
        {
            throw new UserNullException();
        }else if (user.getPasswold()==null)
        {
                throw new  PasswoldNullException();
        }else {
            if (userNameRegex(user.getUserName())==false){
              throw new UserNameValidationException();
            }else if (passRegex(user.getPasswold())==false){
                throw new PasswordValidationException();
            }
        }
        return new UserResult(0,"登录成功");
    }
    /**
     * 正则表达式:验证规则
     */
    public static final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,16}$";
    /**
     * 手机号
     */
    String PHONE_NUMBER_REG = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";

    public boolean userNameRegex(String userName)
    {
        return Pattern.matches(REGEX_PASSWORD, userName);
    }
    public boolean passRegex(String password)
    {
        return Pattern.matches(REGEX_PASSWORD, password);
    }
}

加为要求前端传的是JSON数据,所以对象参数前务必加上@RequestBody这个注解(踩过坑)


项目中加入了swagger配置(swagger简单使用),这里用来输入几条数据进行测试

github代码

个人网站

原文地址:https://www.cnblogs.com/panbingwen/p/10848923.html

时间: 2024-10-08 18:14:15

springboot结合全局异常处理之登录注册验证的相关文章

Flask博客类登录注册验证模块代码(十四)

1 文件系统 blog #博客类 App forms #表单 __init__.py user.py models #模型 __init__.py user.py static #静态文件 templates #模板 common #基类模板 base.html email #邮件 email.html errors #错误 error.html main #主页 index.html user #用户登录注册 login.html register.html views #视图蓝本 __ini

django登录注册验证之密码包含特殊字符,确认密码一致实现

Form验证的原理 首先用户在注册界面提交表单,后台收到表单之后通过request.post取到数据然后传入已经写好的Form类 执行obj.is_valid()这里的obj为Form的实例,在Form类里面对字段一个一个进行验证先执行正则匹配然后执行clean方法 这里的clean方法就是一个钩子,但是不能在验证某个字段的时候调用其他字段,原因是这个时候其他字段不能确定是否验证完成了 需要在所有字段验证之后再执行这个钩子(clean方法)具体实现方法如下: __________________

用户登录注册验证(js)

//判断输入的字符串是否大于指定长度function checkstr(str,digit){ var n=0; for(i=0;i<str.length;i++){ var leg=str.charCodeAt(i); //获取字符串中指定字符的Unicode编码 if(leg>255){ n+=2; }else { n+=1; } } if (n>digit){ return true; }else { return false; } }//判断用户名function checkeU

springboot 全局异常处理

springboot 全局异常处理 研究了半天springboot的全局异常处理,虽然还是需要再多整理一下,但是对于常见的404和500足以可以区分开,能够根据这两个异常分别处理 首先配置视图解析路径 spring.mvc.view.prefix=/WEB-INF/ spring.mvc.view.suffix=.jsp 针对500错误 创建单独的配置类,放在启动类同包或子包下 import org.springframework.web.bind.annotation.ControllerAd

zbb20180921 springboot 全局异常处理 404 500

研究了半天springboot的全局异常处理,虽然还是需要再多整理一下,但是对于常见的404和500足以可以区分开,能够根据这两个异常分别处理 首先配置视图解析路径 spring.mvc.view.prefix=/WEB-INF/ spring.mvc.view.suffix=.jsp 针对500错误 创建单独的配置类,放在启动类同包或子包下 import org.springframework.web.bind.annotation.ControllerAdvice; import org.s

SpringBoot2.0系列教程(五)Springboot框架添加全局异常处理

Hello大家好,本章我们添加全局异常处理.另求各路大神指点,感谢 一:为什么需要定义全局异常 在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,所以我们需要对异常进行捕获,然后给予相应的处理,来减少程序异常对用户体验的影响 二:添加业务类异常 在前面说过的ret文件夹下创建ServiceException package com.example.demo.core.ret; import java.io.Seriali

MVC 全局异常处理及禁用显示头

MVC网站的global.asax中的Application_Start方法里,有这样一段代码: 1 public class MvcApplication : System.Web.HttpApplication 2 { 3 protected void Application_Start() 4 { 5 AreaRegistration.RegisterAllAreas(); 6 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters

SpringMVC的全局异常处理

@ControllerAdvice的使用 我们都知道做项目一般都会有全局异常统一处理的类,那么这个类在Spring中可以用@ControllerAdvice来实现. @ControllerAdvice ,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller.使用这个 Controller ,可以实现三个方面的功能: 全局异常处理 全局数据绑定 全局数据预处理 灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Bo

SpringBoot注册登录(三):注册--验证账号密码是否符合格式及后台完成注册功能

SpringBoot注册登录(一):User表的设计点击打开链接SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接      SpringBoot注册登录(三):注册--验证账号密码是否符合格式及后台完成注册功能点击打开链接     SpringBoot注册登录(四):登录功能--密码错误三次,需要等待2分钟才能登录,固定时间内不能登录点击打开链接 SpringBoot注册登录(五):登录功能--Scheduling Tasks定时作业,用于某个时间段允许/不允