Spring?Validation中的用戶注冊(cè)、JWT令牌之用戶登入功能
??用戶注冊(cè)驗(yàn)證
驗(yàn)證用戶名和密碼進(jìn)行校驗(yàn)(這里拿5-16位非空字符位例子)
public Result register(String username,String password){ User u = userService.findByUserName(username); if (u==null){ userService.register(username,password); return Result.success(); }else{ return Result.error("用戶名已被占用"); } }
??原方法
@PostMapping("/register") public Result register(String username, String password){ if (username!=null && username.length()>=5 && username.length()<=16 && password!=null && password.length()>=5 && password.length()<=16 ){ //查詢用戶 User u = userService.findByUserName(username); if (u==null){ //沒有占用 //注冊(cè) userService.register(username,password); return Result.success(); }else{ //占用 return Result.error("用戶名已被占用"); } }else{ return Result.error("參數(shù)不合法"); } }
這段代碼是一個(gè)用于處理用戶注冊(cè)的Spring Boot控制器方法。它接收兩個(gè)參數(shù):用戶名(username)和密碼(password)。首先,它會(huì)檢查用戶名和密碼的長(zhǎng)度是否在5到16個(gè)字符之間。如果滿足條件,它會(huì)調(diào)用userService的findByUserName方法來查詢數(shù)據(jù)庫中是否已經(jīng)存在該用戶名。如果用戶名不存在,它會(huì)調(diào)用userService的register方法來注冊(cè)新用戶,并返回一個(gè)表示成功的Result對(duì)象。如果用戶名已存在,它會(huì)返回一個(gè)包含錯(cuò)誤信息的Result對(duì)象。如果用戶名或密碼長(zhǎng)度不滿足要求,它也會(huì)返回一個(gè)包含錯(cuò)誤信息的Result對(duì)象。
這種方法既容易出錯(cuò)又繁瑣,經(jīng)過發(fā)展我們現(xiàn)在可以應(yīng)用Spring Validation
??Spring Validation
Spring Validation是一個(gè)用于數(shù)據(jù)驗(yàn)證的框架,它提供了一種簡(jiǎn)單的方式來驗(yàn)證Java對(duì)象的屬性。在Spring MVC中,可以使用Spring Validation來驗(yàn)證用戶輸入的數(shù)據(jù)是否符合預(yù)期的規(guī)則和約束。
?步驟
- 引入Spring Validation 起步依賴
- 在參數(shù)前面添加@Pattern注解
- 在Controller類上添加@Validated注解
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
@Validated public Result register( @Pattern(regexp="^\\S{5,16}$") String username,@Pattern(regexp="^\\S{5,16}$")String password){ if (userService.findByUsername(username)!=null){ return Result,error("該用戶名已被占用"): } userService.register(username,password); return Result.success();
這段代碼是一個(gè)注冊(cè)方法,使用了@Validated注解來啟用參數(shù)驗(yàn)證。它有兩個(gè)參數(shù):username和password,都使用了@Pattern注解來限制它們的格式。username和password都必須是長(zhǎng)度為5到16個(gè)非空白字符的字符串。如果用戶名已經(jīng)存在(通過userService.findByUsername(username)檢查),則返回一個(gè)錯(cuò)誤信息。否則,調(diào)用userService.register(username, password)方法進(jìn)行注冊(cè),并返回成功的結(jié)果。
??設(shè)置全局異常
@RestControllerAdvice public class GlobalExceptionHandler @ExceptionHandler(Exception.class) public Result handleException(Exception e){ e.printstackTrace(); return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失敗");
這是一個(gè)全局異常處理器,用于處理項(xiàng)目中的所有異常。當(dāng)發(fā)生異常時(shí),它會(huì)捕獲異常并返回一個(gè)包含錯(cuò)誤信息的Result對(duì)象。如果異常有消息,則返回該消息,否則返回默認(rèn)的錯(cuò)誤信息"操作失敗"。
- 不要在JWT中存儲(chǔ)敏感信息,因?yàn)镴WT可以被解碼。
- 注意令牌的有效期,避免過長(zhǎng)導(dǎo)致安全問題,過短導(dǎo)致用戶體驗(yàn)不佳。
- 考慮使用刷新令牌機(jī)制來保持用戶長(zhǎng)時(shí)間在線。
??用戶登入(JWT令牌)
??概述
用戶登錄過程中使用JWT(JSON Web Tokens)令牌是一種常見的身份驗(yàn)證方法。JWT是一種緊湊且自包含的方式,用于在各方之間以JSON對(duì)象的形式安全地傳輸信息。在用戶登錄的場(chǎng)景中,JWT可以用于在客戶端和服務(wù)器之間安全地傳輸用戶身份信息。
??組成結(jié)構(gòu)
JWT通常包含以下信息:
- Header(頭部):指定令牌的類型和使用的簽名算法(如HS256)。
- Payload(負(fù)載):包含所謂的Claims(聲明),例如用戶的ID、用戶名、角色、發(fā)行時(shí)間(iat)和過期時(shí)間(exp)等。
- Signature(簽名):使用密鑰對(duì)頭部和負(fù)載進(jìn)行簽名,確保令牌的安全性。
header+"."+payload+"."+singnature ---> 組成唯一的token
??JWT令牌
生成令牌和驗(yàn)證令牌到時(shí)候公司應(yīng)該會(huì)給工具類,到時(shí)候大家直接調(diào)用里面方法就行,這里先了解一下
?導(dǎo)入依賴
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.10.3</version> </dependency>
?生成令牌
void genToken() { Map<String, Object> user = new HashMap<>(); user.put(“id”, “1”); user.put(“username”, “張三”); String token = JWT.create() .withClaim(“user”, user) .withExpiresAt(new Date(System.currentTimeMillis() + 1000*60*60)) .sign(Algorithm.HMAC256(“秘鑰")); System.out.println(token); }
?驗(yàn)證令牌
void parseToken() { String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9……."; JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("itheima")).build(); DecodedJWT decodedJWT = jwtVerifier.verify(token); Map<String, Claim> claims = decodedJWT.getClaims(); System.out.println(claims.get("user")); }
但是每一個(gè)都調(diào)用驗(yàn)證太麻煩了,咱們直接配置一個(gè)攔截器,對(duì)所有的需要的請(qǐng)求都通過攔截器
??JWT令牌驗(yàn)證攔截器
?聲明攔截器
package com.liup.interceptor; import com.auth0.jwt.exceptions.AlgorithmMismatchException; import com.auth0.jwt.exceptions.SignatureVerificationException; import com.auth0.jwt.exceptions.TokenExpiredException; import com.fasterxml.jackson.databind.ObjectMapper; import com.office.utils.JWTUtils; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; /** * JWT驗(yàn)證攔截器 */ public class JWTInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Map<String,Object> map = new HashMap<>(); //令牌建議是放在請(qǐng)求頭中,獲取請(qǐng)求頭中令牌 String token = request.getHeader("token"); try{ JWTUtils.verify(token);//驗(yàn)證令牌 return true;//放行請(qǐng)求 } catch (SignatureVerificationException e) { e.printStackTrace(); map.put("msg","無效簽名"); } catch (TokenExpiredException e) { e.printStackTrace(); map.put("msg","token過期"); } catch (AlgorithmMismatchException e) { e.printStackTrace(); map.put("msg","token算法不一致"); } catch (Exception e) { e.printStackTrace(); map.put("msg","token失效"); } map.put("state",false);//設(shè)置狀態(tài) //將map轉(zhuǎn)化成json,response使用的是Jackson String json = new ObjectMapper().writeValueAsString(map); response.setContentType("application/json;charset=UTF-8"); response.getWriter().print(json); return false; } }
?配置攔截器
@Configuration public class WebMvcConfiguration extends WebMvcConfigurationSupport { @Autowired private JwtTokenAdminInterceptor jwtTokenAdminInterceptor; /** * 注冊(cè)自定義攔截器 * * @param registry */ protected void addInterceptors(InterceptorRegistry registry) { log.info("開始注冊(cè)自定義攔截器..."); registry.addInterceptor(jwtTokenAdminInterceptor) .addPathPatterns("/admin/**") .excludePathPatterns("/admin/employee/login");//除去那個(gè)路徑不驗(yàn)證 }
到此這篇關(guān)于Spring Validation之用戶注冊(cè)、JWT令牌之用戶登入的文章就介紹到這了,更多相關(guān)Spring Validation用戶登入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解mybatis插入數(shù)據(jù)后返回自增主鍵ID的問題
這篇文章主要介紹了mybatis插入數(shù)據(jù)后返回自增主鍵ID詳解,本文通過場(chǎng)景分析示例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07Java 實(shí)現(xiàn)緩存的三種方式及問題匯總
這篇文章主要介紹了Java 實(shí)現(xiàn)緩存的三種方式及問題匯總,HashMap實(shí)現(xiàn)緩存,可以實(shí)現(xiàn)簡(jiǎn)單的本地緩存,但是實(shí)際開發(fā)中不推薦,我們可以簡(jiǎn)單模擬一下緩存的實(shí)現(xiàn),本文通過示例代碼介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-03-03Springboot 2.6集成redis maven報(bào)錯(cuò)的坑記錄
這篇文章主要介紹了Springboot 2.6集成redis maven報(bào)錯(cuò)的坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04J2EE驗(yàn)證碼圖片如何生成和點(diǎn)擊刷新驗(yàn)證碼
這篇文章主要介紹了J2EE如何生成驗(yàn)證碼圖片如何生成,如何點(diǎn)擊刷新驗(yàn)證碼的相關(guān)方法,感興趣的小伙伴們可以參考一下2016-04-04Spring Security異步無法獲取用戶認(rèn)證信息的解決方法
最近使用 Springboot 中 @Async 注解異步調(diào)用方法時(shí),發(fā)現(xiàn)無法獲取到用戶認(rèn)證信息,本文小編給大家介紹了Spring Security異步無法獲取用戶認(rèn)證信息的原因和解決方法,并通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09關(guān)于Intellij IDEA中的Version Control問題
這篇文章主要介紹了Intellij IDEA中的Version Control問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11