Token令牌 Redis 案例

关注 “弋凡”(YiFan)微信公众号吧 记录简单笔记 做你的最爱
SpringBoot 整合 Redis 看之前文章

Token 是什么?

token 专业术语为 令牌,更通俗来说就相当于暗号,一般用于身份验证的时候,用token更加的安全,

Token 怎么用?

一般通过ajax发送请求,服务器接收请求去验证用户名和密码,然后返回给客户端一串字符串(token),客户端接收这个token把它存在Cookie 或者Local Storage中
客户端每次请求资源的时候需要携带这个token,服务器去接收这个token然后去验证,成功则返回请求需要的数据

Token 存在 Redis

1,导入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>
2,编写 application.properties
# redis 配置
spring.redis.host=127.0.0.1
spring.redis.port=6379

server.port=999
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.thymeleaf.cache = false
# 实体类的包扫描--- 这里使用了 MybatisPlus
mybatis-plus.type-aliases-package =com.yifan.pojo
3,添加 RedisConfig 以及
封装好的 RedisUtil(之前文章有叙述)
4,编写Controller
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yifan.pao.Result;
import com.yifan.pojo.User;
import com.yifan.service.UserService;
import com.yifan.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.UUID;

@Controller
public class UserController {

    @Autowired
    private UserService userService;
    @Autowired
    private RedisUtil redisUtil;

    @GetMapping("index")
    public String index(){
        return "index";
    }

    @GetMapping({"/","/login"})
    public String login(){
        return "login";
    }

    @GetMapping("getInfoToken")
    @ResponseBody
    public String getinfo(HttpServletRequest request){
        String token = request.getHeader("token");
        System.err.println("token ---> "+token);
        long expire = redisUtil.getExpire(token);
        System.err.println("expire ---> "+redisUtil.getExpire(token));
        if(expire > 0L){
            return "ok";
        }else {
            return "error";
        }
    }
    @PostMapping("toindex")
    @ResponseBody
    public Result index(@RequestParam String name , @RequestParam String password){
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getName,name).eq(User::getPassword,password);
        User one = userService.getOne(wrapper);
        if(one != null ){
            String token = UUID.randomUUID()+"";
            redisUtil.set(token,one,30000L);
            return new Result(one ,token);
        } else {
          return null ;
        }
    }
}
5,这里的 Result是封装的返回结果类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
    private T object;
    private String data;
}
6,前端页面 一个简单的登录页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<h4>登录</h4>
<p> <span>name:</span> <input type="text" id="name"></p>
<p> <span>password:</span> <input type="text" id="password"></p>
<p><input type="button" value="login" class="login"></p>
<p><input type="button" value="token login" class="tokenlogin"></p>
</body>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
    $(function () {
        $(".tokenlogin").click(function () {
            $.ajax({
                type: "get",
                url: "getInfoToken",
                headers:{"token":localStorage.token},
                success: function (res) {
                    console.log("-->res "+res);
                    if(res == "ok"){
                        // 跳转 controller 中的 index 请求
                        window.location.href = "index";
                    }
                }
            })
        });
        $(".login").click(function () {
            $.ajax({
                type: "post",
                url: "toindex",
                data: {name:$("#name").val(), password:$("#password").val()},
                dataType: "json",
                success: function (res) {
                    // 本地存储这个token
                    localStorage.token=res.data;
                    if(res !=null){
                        window.location.href = "index";
                    }
                }
            })
        })
    })
</script>
</html>
7,登录成功页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<h3>登录成功了</h3>
</body>

</html>
8,效果

在这里插入图片描述
end —

快来关注“弋凡”微信公众号吧

快来关注“弋凡”微信公众号把

SpringBoot是一款基于Spring框架的Web应用开发框架,其强大的功能和简单易用的特性在Web开发领域赢得了广泛的应用。在进行Web开发时,常常需要实现用户身份验证和访问授权,此时Token令牌就成为一种常用的身份认证的方式。 Token令牌验证的具体实现包括两个方面:生成Token和验证Token。生成Token时,可以利用Spring Security提供的TokenManagement类来生成Token,并将用户信息和Token存储Redis缓存中;验证Token时,则可以自定义一个Token校验过滤器,将请求中的TokenRedis缓存中的Token进行比对验证。 具体实现步骤如下: 1. 添加Redis相关依赖:pom.xml文件中添加以下依赖,实现对Redis缓存的支持: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis连接:在application.properties文件中配置Redis连接信息,包括Redis服务器地址、端口等。 3. 生成Token:可以利用Spring Security提供的TokenManagement类,在用户登录成功后生成Token,并存储Redis缓存中,代码如下: ```java String token = tokenManagement.createToken(userDetails); redisTemplate.opsForValue().set(token, userDetails, expiresIn, TimeUnit.SECONDS); ``` 其中userDetails为用户认证信息,expiresIn为Token过期时间,TimeUnit为时间单位。 4. 自定义Token校验过滤器:针对每个请求,都要对请求中的Token进行验证,可以自定义一个Token校验过滤器,在过滤器中对请求中的Token进行解析并与Redis缓存中的Token进行比对验证,代码如下: ```java public class TokenFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpRequest, HttpServletResponse httpResponse, FilterChain filterChain) throws ServletException, IOException { String token = httpRequest.getHeader("Authorization"); if (StringUtils.isNotBlank(token)) { Object userDetails = redisTemplate.opsForValue().get(token); if (userDetails != null) { Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, ((UserDetails) userDetails).getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authentication); } } filterChain.doFilter(httpRequest, httpResponse); } } ``` 此处通过HttpServletRequest获取请求头中的Token,然后通过RedisTemplate从Redis缓存中获取用户认证信息。如果Token有效,则将用户认证信息存储到SecurityContext中,以便后续访问授权。 以上就是利用SpringBoot实现Token令牌验证Redis的具体实现过程。通过这种方式,可以实现安全、高效、灵活的身份认证和访问授权控制,为Web应用的开发提供了更多的便利和选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值