最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Validation中的用戶注冊(cè)、JWT令牌之用戶登入功能

 更新時(shí)間:2024年11月13日 11:38:58   作者:Y小夜  
本文介紹了使用SpringValidation進(jìn)行用戶注冊(cè)驗(yàn)證和JWT進(jìn)行用戶登錄的方法,在用戶注冊(cè)時(shí),通過@Validated注解和@Pattern注解對(duì)用戶名和密碼進(jìn)行格式校驗(yàn),并使用Result對(duì)象返回驗(yàn)證結(jié)果,感興趣的朋友一起看看吧

??用戶注冊(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ì)檢查用戶名和密碼的長度是否在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ì)象。如果用戶名或密碼長度不滿足要求,它也會(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都必須是長度為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可以被解碼。
  • 注意令牌的有效期,避免過長導(dǎo)致安全問題,過短導(dǎo)致用戶體驗(yàn)不佳。
  • 考慮使用刷新令牌機(jī)制來保持用戶長時(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)文章

  • Java多線程中的wait、notify和park、unpark的使用詳解

    Java多線程中的wait、notify和park、unpark的使用詳解

    這篇文章主要介紹了Java多線程中的wait、notify和park、unpark的使用詳解,它們都是線程之間進(jìn)行協(xié)作的手段,都屬于 Object 對(duì)象的方法,必須獲得此對(duì)象的鎖,才能調(diào)用這幾個(gè)方法,需要的朋友可以參考下
    2023-12-12
  • Java實(shí)現(xiàn)馬踏棋盤算法

    Java實(shí)現(xiàn)馬踏棋盤算法

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)馬踏棋盤算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java中如何使用Redis GEO測(cè)算經(jīng)緯度距離

    Java中如何使用Redis GEO測(cè)算經(jīng)緯度距離

    GEO也是Redis中提供的一種數(shù)據(jù)類型,可以將其理解成ZSet有序集合類型,本文給大家介紹Java-使用Redis GEO測(cè)算經(jīng)緯度距離,感興趣的朋友一起看看吧
    2023-11-11
  • 淺談sql_@SelectProvider及使用注意說明

    淺談sql_@SelectProvider及使用注意說明

    這篇文章主要介紹了sql_@SelectProvider及使用注意說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java代碼審計(jì)之目錄遍歷的解決

    java代碼審計(jì)之目錄遍歷的解決

    目錄穿越漏洞,也叫做目錄遍歷/路徑遍歷漏洞,本文主要介紹了java代碼審計(jì)之目錄遍歷的解決,文中通過案例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • springboot之Duration(java.time.Duration)在yml properties中的配置方式

    springboot之Duration(java.time.Duration)在yml properties中

    這篇文章主要介紹了springboot之Duration(java.time.Duration)在yml properties中的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Mybatis-plus全局id生成策略詳解

    Mybatis-plus全局id生成策略詳解

    這篇文章主要介紹了Mybatis-plus全局id生成策略詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 三角形類 Triangle的用法詳解

    java 三角形類 Triangle的用法詳解

    這篇文章主要介紹了java 三角形類 Triangle的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • eclipse springboot工程打war包方法及再Tomcat中運(yùn)行的方法

    eclipse springboot工程打war包方法及再Tomcat中運(yùn)行的方法

    這篇文章主要介紹了eclipse springboot工程打war包方法及再Tomcat中運(yùn)行的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • MyBatis插入Insert、InsertSelective的區(qū)別及使用心得

    MyBatis插入Insert、InsertSelective的區(qū)別及使用心得

    這篇文章主要介紹了MyBatis插入Insert、InsertSelective的區(qū)別及使用心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

淮安市| 惠州市| 仲巴县| 皮山县| 武平县| 泗阳县| 茌平县| 新化县| 宜城市| 庆云县| 元氏县| 包头市| 东乌珠穆沁旗| 定兴县| 奉新县| 商洛市| 云梦县| 佛教| 巴彦淖尔市| 扎鲁特旗| 普陀区| 秦皇岛市| 修水县| 准格尔旗| 治县。| 怀安县| 连南| 鹤峰县| 手游| 涪陵区| 浪卡子县| 云霄县| 江北区| 辽宁省| 建昌县| 民权县| 澄江县| 大足县| 奎屯市| 尉犁县| 方山县|