springboot生成token并在后续的相关操作使用token进行验证

第一步:导入依赖

第二步:创建Creat类用于生成token

public class CreatJwt {
    public static String getoken(Comsumer comsumer){
        Jwts.builder();//生成
        Jwts.parser();//解密
        
        JwtBuilder jwtBuilder=Jwts.builder()
                .setId(comsumer.getId()+"")//设置需要加密的内容
                .setSubject(comsumer.getUsername())
                .setIssuedAt(new Date())//token保留时间
                .signWith(SignatureAlgorithm.HS256,"my-123").setExpiration(
                        new Date(new Date().getTime()+86400000)
                );
        System.out.println(jwtBuilder.compact());
        return jwtBuilder.compact();
    }
}

第四步,在Controller层的应用,在登录的时候生成token,接口的话自己写,这里就不发了

    @RequestMapping("/login")
    public Object login(@RequestParam String username, @RequestParam String password, HttpServletResponse response){
        JSONObject jsonObject=new JSONObject();
        Comsumer comsumer = comsumerService.findname(username,password);
        String token= CreatJwt.getoken(comsumer);//登录的使用调用CreatJwt生成
        jsonObject.put("comsumer",comsumer);
        jsonObject.put("token",token);
        response.setHeader("token",token);//将token缓存到header
        return jsonObject;

    }

在Postmani调用接口成功生成token

 

第五步,解密,这里用根据用户ID和更新数据进行示例

    @PutMapping("/test/{phone}")
    public Object yyy(HttpServletRequest httpServletRequest,@PathVariable String phone){
        JSONObject jsonObject=new JSONObject();
        //获取token
        String token = httpServletRequest.getHeader("token");
        
        //调用解密方法
        Claims claims= Jwts.parser()
                .setSigningKey("my-123")
                .parseClaimsJws(token)
                .getBody();
        //解密ID
        Integer id=Integer.valueOf(claims.getId());
        //解密用户名
        String username=claims.getSubject();
        Comsumer comsumer=new Comsumer();
        comsumer.setId(id);
        comsumer.setPhone(phone);
        //判断解密的结果
        if(username!=null&&claims.getId()!=null&&username.equals(username))
        {
                comsumerService.updateById(comsumer);
                jsonObject.put("code",200);
                return jsonObject;
        }else
        {
            return "500";
        }
    }

用第四步获得的token去调用test接口

 修改成功,返回200;

如果不使用token,解密失败,返回500

 

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot中生成Token的一种常见方法是使用JSON Web Token(JWT)。JWT是一种轻量级的身份验证和授权协议,可以在网络应用程序中安全地传输信息。以下是在Spring Boot中使用JWT生成Token的步骤: 1. 添加依赖项:在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 2. 创建一个JWT工具类:创建一个名为JwtTokenUtil的工具类,用于生成验证JWT令牌。以下是一个简单的例子: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.function.Function; @Component public class JwtTokenUtil { private static final long serialVersionUID = -2550185165626007488L; public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; @Value("${jwt.secret}") private String secret; // retrieve username from jwt token public String getUsernameFromToken(String token) { return getClaimFromToken(token, Claims::getSubject); } // retrieve expiration date from jwt token public Date getExpirationDateFromToken(String token) { return getClaimFromToken(token, Claims::getExpiration); } public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) { final Claims claims = getAllClaimsFromToken(token); return claimsResolver.apply(claims); } // for retrieving any information from token we will need the secret key private Claims getAllClaimsFromToken(String token) { return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); } // check if the token has expired private Boolean isTokenExpired(String token) { final Date expiration = getExpirationDateFromToken(token); return expiration.before(new Date()); } // generate token for user public String generateToken(UserDetails userDetails) { Map<String, Object> claims = new HashMap<>(); return doGenerateToken(claims, userDetails.getUsername()); } // while creating the token - // 1. Define claims of the token, like Issuer, Expiration, Subject, and the ID // 2. Sign the JWT using the HS512 algorithm and secret key. // 3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1) compaction of the JWT to a URL-safe string private String doGenerateToken(Map<String, Object> claims, String subject) { return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)) .signWith(SignatureAlgorithm.HS512, secret).compact(); } // validate token public Boolean validateToken(String token, UserDetails userDetails) { final String username = getUsernameFromToken(token); return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); } } ``` 3. 创建一个Authentication Controller:创建一个名为AuthenticationController的控制器,用于处理用户身份验证生成JWT令牌。以下是一个简单的例子: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/auth") public class AuthenticationController { @Autowired private AuthenticationManager authenticationManager; @Autowired private JwtTokenUtil jwtTokenUtil; @Autowired private UserDetailsService userDetailsService; @PostMapping("/login") public ResponseEntity<?> createAuthenticationToken(@RequestBody AuthenticationRequest authenticationRequest) throws Exception { try { authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(authenticationRequest.getUsername(), authenticationRequest.getPassword())); } catch (AuthenticationException e) { throw new Exception("Incorrect username or password", e); } final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername()); final String token = jwtTokenUtil.generateToken(userDetails); return ResponseEntity.ok(new AuthenticationResponse(token)); } } ``` 4. 在application.properties中设置JWT密钥: ```properties jwt.secret=mysecretkey ``` 现在,您可以通过向“/auth/login”端点发出POST请求来生成JWT令牌。请求主体应该是包含用户名和密码的JSON对象。如果成功验证用户凭据,控制器将返回一个包含JWT令牌的JSON对象。您可以将此令牌包含在后续请求的Authorization标头中,以进行身份验证和授权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值