java 实现token登录,并进行上下文存储用户信息

在Java中实现token登录上下文存储用户信息,可以使用Java Web框架(如Spring Boot)和JWT(JSON Web Token)来实现。

首先,需要引入相关依赖。在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jwt-api</artifactId>
    <version>0.11.2</version>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jwt-jackson</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
接下来,创建一个类来处理token的生成和验证逻辑。例如,创建一个名为TokenUtil的类:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class TokenUtil {

  private static final String SECRET_KEY = "your_secret_key"; // 设置密钥

  public String generateToken(String username) {
      Date now = new Date();
      Date expiryDate = new Date(now.getTime() + 3600000); // 设置token过期时间为1小时

      return Jwts.builder()
              .setSubject(username)
              .setIssuedAt(now)
              .setExpiration(expiryDate)
              .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
              .compact();
  }

  public String getUsernameFromToken(String token) {
      Claims claims = Jwts.parser()
              .setSigningKey(SECRET_KEY)
              .parseClaimsJws(token)
              .getBody();

      return claims.getSubject();
  }

  public boolean validateToken(String token) {
      try {
          Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
          return true;
      } catch (Exception e) {
          return false;
      }
  }
}

接下来,在用户登录成功后,可以生成一个token并将其返回给客户端。例如,创建一个名为LoginController的类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoginController {

    @Autowired
    private TokenUtil tokenUtil;

    @PostMapping("/login")
    public String login(@RequestBody User user) {
        // 验证用户名和密码
        if (user.getUsername().equals("admin") && user.getPassword().equals("password")) {
            // 登录成功,生成token
            String token = tokenUtil.generateToken(user.getUsername());
            
            // 如果用户信息量比较多,可以将用户信息存入非关系型数据库
            //String userName = request.getHeader("username");
        	//String passWord = request.getHeader("password");
        	//UserInfoEntity user = new UserInfoEntity();
        	//user.setUsername(userName);
            //redisTemplate.opsForValue().set(token , user);
            return token;
        } else {
            // 登录失败
            return "Invalid username or password";
        }
    }
}
1.在其他需要验证用户身份的请求中,可以使用拦截器或过滤器或AOP来验证token,并从token中获取用户信息。例如,创建一个名为AuthInterceptor的拦截器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Autowired
    private TokenUtil tokenUtil;
     @Resource
    private WebContext webContext;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从请求头中获取token
        String token = request.getHeader("Authorization");

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7); // 去掉"Bearer "前缀

            // 验证token是否有效
            if (tokenUtil.validateToken(token)) {
                String username = tokenUtil.getUsernameFromToken(token);
                // 将用户信息存储在上下文中,供后续使用
                webContext.setCurrentUser(username);
                return true;
            }
        }

        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 返回401未授权状态码
        return false;
    }
}

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import sun.misc.Request;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Collection;

@Component
public class WebContext {
    private static final String USER_ATTRIBUTES = "USER_ATTRIBUTES";


    @Resource
    private RedisUtil redisUtil;

    /**
     * Sets current user.
     *
     * @param user the user
     */
    public void setCurrentUser(UserInfoEntity user) {
        RequestContextHolder.currentRequestAttributes().setAttribute(USER_ATTRIBUTES, user, RequestAttributes.SCOPE_REQUEST);
    }

    /**
     * Gets current user.
     *
     * @return the current user
     */
    public UserInfoEntity getCurrentUser() {
        UserInfoEntity user = (UserInfoEntity) RequestContextHolder.currentRequestAttributes().getAttribute(USER_ATTRIBUTES, RequestAttributes.SCOPE_REQUEST);
        try {
            if (null != user) {
                return user;
            } else {
                ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
                HttpServletRequest request = requestAttributes.getRequest();
                String token = request.getHeader("token");
                user = (UserInfoEntity) redisUtil.get(token);
                if (null == user) {
                   throw new LoginException(LoginExceptionEnum.NOT_LOGIN_ERROR.getCode(),
                            LoginExceptionEnum.NOT_LOGIN_ERROR.getDesc());
                }
                setCurrentUser(user);
                return user;
            }
        } catch (LoginException e) {
            e.printStackTrace();
            throw new RuntimeException("");
        }
    }
}

采用aop的形式
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;


@Slf4j
@Aspect
@Component
public class LoginAspect {

    @Resource
    private RedisUtil redisUtil;
    @Resource
    private WebContext webContext;


    @Resource
    RedisTemplate redisTemplate;


    @Pointcut("execution(public * com.tairui.energy.controller.*.*(..)) " +
            "&& !execution(public * com.tairui.energy.controller.LoginController.login(..)))  ")
    public void loginCheck() {
    }

    @Before("loginCheck()")
    public void checkParam(JoinPoint pjp) throws Throwable {
        // 接收到请求,记录请求内容
        try {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            String token = request.getHeader(BaseConstant.TOKEN);
            if(token==null){
                throw new LoginException(LoginExceptionEnum.NOT_LOGIN_ERROR.getCode(),
                        LoginExceptionEnum.NOT_LOGIN_ERROR.getDesc());
            }
            UserInfoEntity obj = (UserInfoEntity)redisUtil.get(token);
            if (null == webContext.getCurrentUser()) {
                webContext.setCurrentUser(obj);
            }
            if (Objects.isNull(obj)) {
                log.error("************该用户TOKEN已过期!*************");
                throw new LoginException(LoginExceptionEnum.NOT_LOGIN_ERROR.getCode(),
                        LoginExceptionEnum.NOT_LOGIN_ERROR.getDesc());
            }
            boolean set = redisUtil.expire(token, 1000 * 3600 * 4);
        } catch (LoginException e) {
            e.printStackTrace();
            throw new LoginException(LoginExceptionEnum.NOT_LOGIN_ERROR.getCode(), e.getLocalizedMessage());
        }
    }
}

####最后,在需要获取用户信息的地方,可以通过UserContext类来获取当前登录用户的信息。

public class TestService {
	@Resource
    private WebContext webContext;
    
    public void doSomething() {
        String username = webContext.getUser();
        // 使用username进行相应的操作...
    }
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java实现Token登录验证可以通过以下步骤来实现: 1. 用户登录时,服务器端生成一个Token,并将Token用户信息关联存储起来。Token可以是一个随机生成的字符串,也可以使用JWT(JSON Web Token)等标准方式生成。 2. 服务器将生成的Token返回给客户端,在登录接口的响应包含Token信息。 3. 客户端在后续请求Token以特定的方式传递给服务器。常见的方式有将Token放在请求头的Authorization字段,或者放在请求参数。 4. 服务器接收到请求后,从请求获取Token,并根据存储Token信息进行验证。验证方式可以是查询数据库或缓存Token信息,或者使用JWT解析Token并验证签名等。 5. 如果验证成功,服务器可以根据Token关联的用户信息进行相应操作。如果验证失败,则返回相应的错误信息。 以下是一个简单的示例代码: ```java // 生成Token并关联用户信息 public String generateToken(User user) { // 生成随机字符串作为Token String token = generateRandomString(); // 将Token用户信息关联存储起来,例如存储在数据库或缓存 tokenRepository.saveToken(token, user); return token; } // 验证Token public boolean validateToken(String token) { // 查询数据库或缓存Token信息 TokenInfo tokenInfo = tokenRepository.getTokenInfo(token); if (tokenInfo != null && tokenInfo.isValid()) { // Token验证通过 return true; } else { // Token验证失败 return false; } } // 示例的登录接口 public ResponseEntity<?> login(String username, String password) { // 根据用户名和密码验证用户身份 User user = userRepository.getUserByUsernameAndPassword(username, password); if (user != null) { // 登录成功,生成Token并返回给客户端 String token = generateToken(user); // 将Token放入响应的头部或作为响应体返回给客户端 HttpHeaders headers = new HttpHeaders(); headers.add("Authorization", "Bearer " + token); return ResponseEntity.ok().headers(headers).build(); } else { // 登录失败 return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } } ``` 请注意,这只是一个简单示例,并未涵盖所有细节。在实际开发,您可能需要更加完善的实现,并考虑安全性、Token的过期时间、刷新Token等方面的问题。同时也可以结合框架或库来简化Token验证的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值