spring boot web请求token获取用户信息 工具类

  • @Company: 洛阳图联科技有限公司

  • @Date: 2019/12/10 17:05

*/

public class SmartRequestTokenUtil {

private static ThreadLocal requestUserThreadLocal = new ThreadLocal();

public static void setUser(HttpServletRequest request, SystemUserVo requestToken) {

request.getSession().setAttribute(CommonConst.SESSION_CURRENT_USER_KEY, requestToken);

request.getSession().setAttribute(CommonConst.X_ACCESS_TOKEN,request.getHeader(CommonConst.X_ACCESS_TOKEN));

requestUserThreadLocal.set(requestToken);

}

public static SystemUserVo getThreadLocalUser() {

return requestUserThreadLocal.get();

}

public static SystemUserVo getRequestUser() {

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

if (requestAttributes != null) {

HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();

if (request != null) {

return (SystemUserVo) request.getSession().getAttribute(CommonConst.SESSION_CURRENT_USER_KEY);

}

}

return null;

}

public static String getRequestToken() {

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

if (requestAttributes != null) {

HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();

if (request != null) {

//解决- 跨服务调用接口时,拦截器session判断null转string异常问题

Object session = request.getSession().getAttribute(CommonConst.X_ACCESS_TOKEN);

if(session != null){

return session.toString();

}

}

}

return null;

}

public static String getRequestUserId() {

SystemUserVo requestUser = getRequestUser();

if (null == requestUser) {

return null;

}

return requestUser.getId();

}

public static String getRequestCompanyId() {

SystemUserVo requestUser = getRequestUser();

if (null == requestUser) {

return null;

}

return requestUser.getCompanyId();

}

}

user对象

import com.tulian.cim6d.valid.user.UserInterface;

import io.swagger.annotations.ApiModelProperty;

import lombok.Data;

import java.util.Date;

/**

  • 用户信息

  • @version 1.0

  • @since JDK1.8

  • @author tarzan

  • @date 2019年12月06日 16:29:12

*/

@Data

public class SystemUserVo {

public SystemUserVo(){}

public SystemUserVo(UserInterface ui){

this.companyId = ui.getCompanyId();

this.id = ui.getUserId();

this.loginName = ui.getLoginName();

this.realName = ui.getName();

}

/**

  • 主键

*/

@ApiModelProperty(value = “主键”)

private String id;

/**

  • 昵称

*/

@ApiModelProperty(value = “昵称”)

private String nickName;

/**

  • 真实姓名

*/

@ApiModelProperty(value = “真实姓名”)

private String realName;

/**

  • 手机号

*/

@ApiModelProperty(value = “手机号”)

private String mobile;

/**

  • 性别(1:男,2:女)

*/

@ApiModelProperty(value = “性别(1:男,2:女)”)

private Integer sex;

/**

  • 登录用户名

*/

@ApiModelProperty(value = “登录用户名”)

private String loginName;

/**

  • 主属部门id

*/

@ApiModelProperty(value = “主属部门id”)

private String primaryDepartmentId;

/**

  • 主属部门id

*/

@ApiModelProperty(value = “主属部门id”)

private String primaryDepartmentName;

/**

  • 附属部门id(多个用逗号隔开)

*/

@ApiModelProperty(value = “附属部门id(多个用逗号隔开)”)

private String secondaryDepartmentId;

/**

  • 附属部门名称(多个用逗号隔开)

*/

@ApiModelProperty(value = “附属部门名称(多个用逗号隔开)”)

private String secondaryDepartmentNames;

/**

  • 职位

*/

@ApiModelProperty(value = “职位”)

private String duty;

/**

  • 汇报对象id(t_system_user中的id)

*/

@ApiModelProperty(value = “汇报对象id”)

private String reportPersonId;

/**

  • 入职日期

*/

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

资料领取方式:戳这里前往获取

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一份使用 Spring Boot 和 MyBatis Plus 实现 Token 校验的示例代码: 1. 首先,我们需要在 pom.xml 文件中添加相关依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis.plus.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>${jjwt.version}</version> </dependency> ``` 其中,`${spring.boot.version}`、`${mybatis.plus.version}` 和 `${jjwt.version}` 分别表示 Spring Boot、MyBatis Plus 和 JWT 的版本号,可以根据需要进行修改。 2. 创建一个 TokenUtils 工具类,用于生成和解析 JWT: ```java public class TokenUtils { private static final String SECRET_KEY = "your_secret_key"; private static final long EXPIRATION_TIME = 86400000L; // token 过期时间为 24 小时 public static String generateToken(User user) { Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(user.getUsername()) .claim("userId", user.getId()) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static User parseToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); return new User( Long.parseLong(claims.get("userId").toString()), claims.getSubject() ); } } ``` 其中,`generateToken()` 方法用于生成 JWT,`parseToken()` 方法用于解析 JWT。`SECRET_KEY` 是一个字符串,用于签名 JWT,应该保密存储。`EXPIRATION_TIME` 表示 token 的过期时间,这里设置为 24 小时。 3. 创建一个 AuthInterceptor 拦截器,用于拦截需要进行 Token 校验的请求: ```java public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token != null && token.startsWith("Bearer ")) { token = token.substring(7); try { User user = TokenUtils.parseToken(token); request.setAttribute("currentUser", user); return true; } catch (Exception e) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } } else { response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } } } ``` 其中,`preHandle()` 方法会在请求到达控制器之前被调用,如果请求头中包含有效的 JWT,则将其解析出来,并将当前用户信息存储到 `HttpServletRequest` 对象中,然后返回 `true`;否则,返回 `false`,并设置响应状态码为 401(未授权)。 4. 在 Spring Boot 的配置类中注册 AuthInterceptor 拦截器: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/api/**") .excludePathPatterns("/api/user/login"); // 登录接口不需要进行 token 校验 } } ``` 其中,`.addPathPatterns("/api/**")` 表示对 `/api` 目录下的所有请求进行拦截,`.excludePathPatterns("/api/user/login")` 表示对 `/api/user/login` 接口不进行拦截。 5. 在控制器中使用 `@CurrentUser` 注解获取当前用户信息: ```java @RestController @RequestMapping("/api/user") public class UserController { @Autowired private UserService userService; @PostMapping("/login") public Result login(@RequestBody LoginRequest request) { User user = userService.login(request.getUsername(), request.getPassword()); String token = TokenUtils.generateToken(user); return Result.success(token); } @GetMapping("/info") public Result getUserInfo(@CurrentUser User user) { return Result.success(user); } } ``` 其中,`@CurrentUser` 注解用于从 `HttpServletRequest` 对象中获取当前用户信息,代码如下: ```java @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface CurrentUser { } ``` ```java @ControllerAdvice public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().equals(User.class) && parameter.hasParameterAnnotation(CurrentUser.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { return webRequest.getAttribute("currentUser", RequestAttributes.SCOPE_REQUEST); } } ``` 需要在 Spring Boot 的配置类中注册 `CurrentUserMethodArgumentResolver` 类: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new CurrentUserMethodArgumentResolver()); } } ``` 至此,一个简单的使用 Spring Boot 和 MyBatis Plus 实现 Token 校验的示例就完成了。当客户端发送请求时,需要在请求头中添加 `Authorization` 字段,值为 `Bearer <token>`,其中 `<token>` 为生成的 JWT。如果 token 校验成功,控制器中的 `@CurrentUser` 参数会自动填充当前用户信息

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值