Spring?Validation中的用戶注冊、JWT令牌之用戶登入功能
??用戶注冊驗證
驗證用戶名和密碼進行校驗(這里拿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){
//沒有占用
//注冊
userService.register(username,password);
return Result.success();
}else{
//占用
return Result.error("用戶名已被占用");
}
}else{
return Result.error("參數不合法");
}
}這段代碼是一個用于處理用戶注冊的Spring Boot控制器方法。它接收兩個參數:用戶名(username)和密碼(password)。首先,它會檢查用戶名和密碼的長度是否在5到16個字符之間。如果滿足條件,它會調用userService的findByUserName方法來查詢數據庫中是否已經存在該用戶名。如果用戶名不存在,它會調用userService的register方法來注冊新用戶,并返回一個表示成功的Result對象。如果用戶名已存在,它會返回一個包含錯誤信息的Result對象。如果用戶名或密碼長度不滿足要求,它也會返回一個包含錯誤信息的Result對象。
這種方法既容易出錯又繁瑣,經過發(fā)展我們現(xiàn)在可以應用Spring Validation
??Spring Validation
Spring Validation是一個用于數據驗證的框架,它提供了一種簡單的方式來驗證Java對象的屬性。在Spring MVC中,可以使用Spring Validation來驗證用戶輸入的數據是否符合預期的規(guī)則和約束。
?步驟
- 引入Spring Validation 起步依賴
- 在參數前面添加@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();這段代碼是一個注冊方法,使用了@Validated注解來啟用參數驗證。它有兩個參數:username和password,都使用了@Pattern注解來限制它們的格式。username和password都必須是長度為5到16個非空白字符的字符串。如果用戶名已經存在(通過userService.findByUsername(username)檢查),則返回一個錯誤信息。否則,調用userService.register(username, password)方法進行注冊,并返回成功的結果。
??設置全局異常
@RestControllerAdvice
public class GlobalExceptionHandler
@ExceptionHandler(Exception.class)
public Result handleException(Exception e){
e.printstackTrace();
return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失敗");這是一個全局異常處理器,用于處理項目中的所有異常。當發(fā)生異常時,它會捕獲異常并返回一個包含錯誤信息的Result對象。如果異常有消息,則返回該消息,否則返回默認的錯誤信息"操作失敗"。
- 不要在JWT中存儲敏感信息,因為JWT可以被解碼。
- 注意令牌的有效期,避免過長導致安全問題,過短導致用戶體驗不佳。
- 考慮使用刷新令牌機制來保持用戶長時間在線。
??用戶登入(JWT令牌)
??概述
用戶登錄過程中使用JWT(JSON Web Tokens)令牌是一種常見的身份驗證方法。JWT是一種緊湊且自包含的方式,用于在各方之間以JSON對象的形式安全地傳輸信息。在用戶登錄的場景中,JWT可以用于在客戶端和服務器之間安全地傳輸用戶身份信息。
??組成結構

JWT通常包含以下信息:
- Header(頭部):指定令牌的類型和使用的簽名算法(如HS256)。
- Payload(負載):包含所謂的Claims(聲明),例如用戶的ID、用戶名、角色、發(fā)行時間(iat)和過期時間(exp)等。
- Signature(簽名):使用密鑰對頭部和負載進行簽名,確保令牌的安全性。
header+"."+payload+"."+singnature ---> 組成唯一的token
??JWT令牌
生成令牌和驗證令牌到時候公司應該會給工具類,到時候大家直接調用里面方法就行,這里先了解一下
?導入依賴
<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);
}?驗證令牌
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"));
}但是每一個都調用驗證太麻煩了,咱們直接配置一個攔截器,對所有的需要的請求都通過攔截器
??JWT令牌驗證攔截器
?聲明攔截器
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驗證攔截器
*/
public class JWTInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Map<String,Object> map = new HashMap<>();
//令牌建議是放在請求頭中,獲取請求頭中令牌
String token = request.getHeader("token");
try{
JWTUtils.verify(token);//驗證令牌
return true;//放行請求
} 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);//設置狀態(tài)
//將map轉化成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;
/**
* 注冊自定義攔截器
*
* @param registry
*/
protected void addInterceptors(InterceptorRegistry registry) {
log.info("開始注冊自定義攔截器...");
registry.addInterceptor(jwtTokenAdminInterceptor)
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/employee/login");//除去那個路徑不驗證
}到此這篇關于Spring Validation之用戶注冊、JWT令牌之用戶登入的文章就介紹到這了,更多相關Spring Validation用戶登入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot 2.6集成redis maven報錯的坑記錄
這篇文章主要介紹了Springboot 2.6集成redis maven報錯的坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
Spring Security異步無法獲取用戶認證信息的解決方法
最近使用 Springboot 中 @Async 注解異步調用方法時,發(fā)現(xiàn)無法獲取到用戶認證信息,本文小編給大家介紹了Spring Security異步無法獲取用戶認證信息的原因和解決方法,并通過代碼示例介紹的非常詳細,需要的朋友可以參考下2024-09-09
關于Intellij IDEA中的Version Control問題
這篇文章主要介紹了Intellij IDEA中的Version Control問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11

