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

栏目: Java · 发布时间: 6年前

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

在学校做一个校企合作项目,注册登录这一块需要对注册登录进行输入合法的服务器端验证,因为是前后端分离开发,所以要求返回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("请输入用户名和密码");
    }
}

通过注解的方式捕获异常

  • @Controller + @ExceptionHandler
  • @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配置( swagger简单使用 ),这里用来输入几条数据进行测试

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

About Face 3

About Face 3

Alan Cooper、Robert Reimann、David Cronin / John Wiley & Sons / 2007-5-15 / GBP 28.99

* The return of the authoritative bestseller includes all new content relevant to the popularization of how About Face maintains its relevance to new Web technologies such as AJAX and mobile platforms......一起来看看 《About Face 3》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具