springboot結合全局異常處理之登陸註冊驗證

在學校作一個校企合做項目,註冊登陸這一塊須要對註冊登陸進行輸入合法的服務器端驗證,由於是先後端分離開發,因此要求返回JSON數據。 方法有不少,這以爲用全局異常處理比較容易上手前端

全局異常處理

首先來建立一個sprIngboot的web項目或模塊,目錄結構以下java

實體類User.javagit

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

實體類UserResult.java 把數據封裝到這裏返回到客戶端github

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

接下來自定義異常,都繼承自Exception

UserNullException.java 當用戶名爲空拋出這個異常web

public class UserNullException extends Exception{


    public UserNullException() {
        super("用戶名不能爲空");
    }
}

PasswoldNullException.java 當密碼爲空拋出這個異常正則表達式

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

UserNamePasswordNullException.java 當用戶名和密碼都爲空拋出這個異常spring

public class UserNamePasswordNullException extends Exception {
    public UserNamePasswordNullException() {
        super("請輸入用戶名和密碼");
    }
}

UserNameValidationException.jva 當輸入不符合要求的用戶名時拋出此異常後端

public class UserNameValidationException extends Exception{
    public UserNameValidationException() {
        super("請輸入6到16位的數字或字母組合");
    }
}

UserNamePasswordNullException.java 當輸入的密碼不符合要求時拋出這個異常api

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代碼

我的網站

相關文章
相關標籤/搜索