在學校作一個校企合做項目,註冊登陸這一塊須要對註冊登陸進行輸入合法的服務器端驗證,由於是先後端分離開發,因此要求返回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; }
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換成@RestController,@ControllerAdvice換成@RestControllerAdvice,也能夠在@Controller類下的方法那裏加上@ResponseBody服務器
@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簡單使用),這裏用來輸入幾條數據進行測試