欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-02 23:39:10
在学校做一个校企合作项目,注册登录这一块需要对注册登录进行输入合法的服务器端验证,因为是前后端分离开发,所以要求返回json数据。 方法有很多,这觉得用全局异常处理比...

在学校做一个校企合作项目,注册登录这一块需要对注册登录进行输入合法的服务器端验证,因为是前后端分离开发,所以要求返回json数据。

方法有很多,这觉得用全局异常处理比较容易上手

全局异常处理

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

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

实体类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("请输入用户名和密码");
  }
}

通过注解的方式捕获异常

  1. @controller + @exceptionhandler
  2. @controlleradvice + @exceptionhandler

若返回的不是页面,把@controller换成@restcontroller,@controlleradvice换成@restcontrolleradvice,也可以在@controller类下的方法那里加上@responsebody

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

@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这个注解(踩过坑)

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。