springboot結(jié)合全局異常處理實(shí)現(xiàn)登錄注冊(cè)驗(yàn)證
在學(xué)校做一個(gè)校企合作項(xiàng)目,注冊(cè)登錄這一塊需要對(duì)注冊(cè)登錄進(jìn)行輸入合法的服務(wù)器端驗(yàn)證,因?yàn)槭乔昂蠖朔蛛x開(kāi)發(fā),所以要求返回JSON數(shù)據(jù)。
方法有很多,這覺(jué)得用全局異常處理比較容易上手
全局異常處理
首先來(lái)創(chuàng)建一個(gè)sprIngboot的web項(xiàng)目或模塊,目錄結(jié)構(gòu)如下

實(shí)體類(lèi)User.java
@Data
public class User {
private String userName;
private String passwold;
}
實(shí)體類(lèi)UserResult.java 把數(shù)據(jù)封裝到這里返回到客戶(hù)端
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserResult {
private int code;
private String msg;
}
接下來(lái)自定義異常,都繼承自Exception
UserNullException.java 當(dāng)用戶(hù)名為空拋出這個(gè)異常
public class UserNullException extends Exception{
public UserNullException() {
super("用戶(hù)名不能為空");
}
}
PasswoldNullException.java 當(dāng)密碼為空拋出這個(gè)異常
public class PasswoldNullException extends Exception {
public PasswoldNullException() {
super("密碼不能為空");
}
}
UserNamePasswordNullException.java 當(dāng)用戶(hù)名和密碼都為空拋出這個(gè)異常
public class UserNamePasswordNullException extends Exception {
public UserNamePasswordNullException() {
super("請(qǐng)輸入用戶(hù)名和密碼");
}
}
UserNameValidationException.jva 當(dāng)輸入不符合要求的用戶(hù)名時(shí)拋出此異常
public class UserNameValidationException extends Exception{
public UserNameValidationException() {
super("請(qǐng)輸入6到16位的數(shù)字或字母組合");
}
}
UserNamePasswordNullException.java 當(dāng)輸入的密碼不符合要求時(shí)拋出這個(gè)異常
public class UserNamePasswordNullException extends Exception {
public UserNamePasswordNullException() {
super("請(qǐng)輸入用戶(hù)名和密碼");
}
}
通過(guò)注解的方式捕獲異常
- @Controller + @ExceptionHandler
- @ControllerAdvice + @ExceptionHandler
若返回的不是頁(yè)面,把@Controller換成@RestController,@ControllerAdvice換成@RestControllerAdvice,也可以在@Controller類(lèi)下的方法那里加上@ResponseBody

@Controller + @ExceptionHandler
@Controller:注解此類(lèi)是Controller類(lèi)
@ExceptionHandler:此注解注解到類(lèi)的方法上,當(dāng)此注解里定義的異常拋出時(shí),此方法會(huì)被執(zhí)行。如果@ExceptionHandler所在的類(lèi)是@Controller,則此方法只作用在此類(lèi)。如果@ExceptionHandler所在的類(lèi)是@ControllerAdvice,則此方法會(huì)作用在全局
在這里我只進(jìn)行了全局異常的捕獲,就是只用了@RestControllerAdvice,對(duì)全部controller層進(jìn)行了異常監(jiān)控,任何控制層拋出常,只要@RestControllerAdvice類(lèi)下@ExceptionHandler注解的value值指定有的都會(huì)被執(zhí)行
@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是全局異常捕獲類(lèi)
@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,"登錄成功");
}
/**
* 正則表達(dá)式:驗(yàn)證規(guī)則
*/
public static final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,16}$";
/**
* 手機(jī)號(hào)
*/
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數(shù)據(jù),所以對(duì)象參數(shù)前務(wù)必加上@RequestBody這個(gè)注解(踩過(guò)坑)

項(xiàng)目中加入了swagger配置(swagger簡(jiǎn)單使用),這里用來(lái)輸入幾條數(shù)據(jù)進(jìn)行測(cè)試

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb開(kāi)發(fā)入門(mén)第二篇Tomcat服務(wù)器配置講解
關(guān)于@JSONField和@JsonFormat的使用區(qū)別說(shuō)明
Java中Stream流對(duì)多個(gè)字段進(jìn)行排序的方法
Java實(shí)現(xiàn)前端jsencrypt.js加密后端解密的示例代碼
java使用XSSFWorkbook實(shí)現(xiàn)讀寫(xiě)Excel
使用log4j2自定義配置文件位置和文件名(附log4j2.xml配置實(shí)例)
MybatisPlus?構(gòu)造器wrapper的使用與原理解析
List集合多線(xiàn)程并發(fā)條件下不安全如何解決
Java注解如何基于Redission實(shí)現(xiàn)分布式鎖

