已登录购物车

接下来,我们完成已登录购物车。

在刚才的未登录购物车编写时,我们已经预留好了编写代码的位置,逻辑也基本一致。

添加登录校验

购物车系统只负责登录状态的购物车处理,因此需要添加登录校验,我们通过JWT鉴权即可实现。

引入JWT相关依赖

我们引入之前写的鉴权工具:learn-auth-common

<dependency><groupId>com.learn.auth</groupId><artifactId>learn-auth-common</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>

配置公钥

learn:jwt:pubKeyPath: C:/tmp/rsa/rsa.pub # 公钥地址cookieName: LY_TOKEN # cookie的名称

加载公钥

代码:

@ConfigurationProperties(prefix = "learn.jwt")
public class JwtProperties {private String pubKeyPath;// 公钥private PublicKey publicKey; // 公钥private String cookieName;private static final Logger logger = LoggerFactory.getLogger(JwtProperties.class);@PostConstructpublic void init(){try {// 获取公钥和私钥this.publicKey = RsaUtils.getPublicKey(pubKeyPath);} catch (Exception e) {logger.error("初始化公钥失败!", e);throw new RuntimeException();}}public String getPubKeyPath() {return pubKeyPath;}public void setPubKeyPath(String pubKeyPath) {this.pubKeyPath = pubKeyPath;}public PublicKey getPublicKey() {return publicKey;}public void setPublicKey(PublicKey publicKey) {this.publicKey = publicKey;}public String getCookieName() {return cookieName;}public void setCookieName(String cookieName) {this.cookieName = cookieName;}
}

编写拦截器

因为很多接口都需要进行登录,我们直接编写SpringMVC拦截器,进行统一登录校验。同时,我们还要把解析得到的用户信息保存起来,以便后续的接口可以使用。

代码:

public class LoginInterceptor extends HandlerInterceptorAdapter {private JwtProperties jwtProperties;// 定义一个线程域,存放登录用户private static final ThreadLocal<UserInfo> tl = new ThreadLocal<>();public LoginInterceptor(JwtProperties jwtProperties) {this.jwtProperties = jwtProperties;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {// 查询tokenString token = CookieUtils.getCookieValue(request, "LY_TOKEN");if (StringUtils.isBlank(token)) {// 未登录,返回401response.setStatus(HttpStatus.UNAUTHORIZED.value());return false;}// 有token,查询用户信息try {// 解析成功,证明已经登录UserInfo user = JwtUtils.getInfoFromToken(token, jwtProperties.getPublicKey());// 放入线程域tl.set(user);return true;} catch (Exception e){// 抛出异常,证明未登录,返回401response.setStatus(HttpStatus.UNAUTHORIZED.value());return false;}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {tl.remove();}public static UserInfo getLoginUser() {return tl.get();}
}

注意:

  • 这里我们使用了ThreadLocal来存储查询到的用户信息,线程内共享,因此请求到达Controller后可以共享User

  • 并且对外提供了静态的方法:getLoginUser()来获取User信息

配置拦截器

配置SpringMVC,使过滤器生效:

@Configuration
@EnableConfigurationProperties(JwtProperties.class)
public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate JwtProperties jwtProperties;@Beanpublic LoginInterceptor loginInterceptor() {return new LoginInterceptor(jwtProperties);}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor()).addPathPatterns("/**");}
}

添加拦截器解析用户信息相关推荐

  1. token拦截器android_vue.js添加拦截器,实现token认证(使用axios)

    什么是token? token是一个用户自定义的任意字符串,目前开发中,token都是在服务端生成并且token的值会保存到服务器后台.只有服务器和客户端知道这个字符串,于是,这个token就成了两者 ...

  2. javaweb添加拦截器

    js请求后台代码添加拦截器: package com.ctzj.biz.isale.deploy.controller; import java.io.IOException; import java ...

  3. cxf添加拦截器_在CXF API和拦截器中添加Gzip压缩

    cxf添加拦截器 如今,由于我们在响应中发送大量数据,因此必须对API响应执行Gziping. 它节省了网络带宽和交付时间,当然还节省了Internet上的空间. CXF提供了以多种方式使用Gzip压 ...

  4. springboot 添加拦截器之后中文乱码_spring boot 2.x 添加拦截器配置未生效的问题

    背景: 今天有一个需求需要拦截除登录相关请求以外的所有请求,并查看request 中是否包含指定的信息,而自然就想到了使用拦截器就可以轻松实现 编写拦截器,获取请求头信息中的test,并打印出来 @C ...

  5. 为fetch添加拦截器功能

    fetch 添加拦截器拦截器 使用过axios的便会知道axios 有axios.interceptors.request.use请求拦截器与service.interceptors.response ...

  6. 拦截器 java_在Java后端如何添加拦截器

    (1)InterceptorConfig.java文件内容如下: import org.springframework.web.servlet.config.annotation.WebMvcConf ...

  7. springboot添加拦截器 监听等设置

    1.添加拦截器 package com.jy.config;import org.springframework.context.annotation.Configuration; import or ...

  8. 【12306购票】预定订单初始化、解析用户信息以及坐席信息

    预定订单初始化.解析用户信息以及坐席信息 1. 预定订单初始化 2. 获取用户信息 3. 解析用户信息 4. 获取乘客信息列表 5. 解析坐席类型 6. 构造乘客信息 学习目标 了解 预定订单初始化 ...

  9. Okhttp 插入缓存拦截器 解析

    我们在做网络请求的时候,如果网络请求过于频繁而且请求的数据变动不大,或者基本没有变动,这个时候如果没有缓存功能,我们想一下 会浪费掉多少资源,一次请求刷新一次,去请求一次,不但会消耗用户的流量,而且还 ...

最新文章

  1. 采集标签_科创致远轻MES工时采集系统帮助工厂快速构建工效节拍绩效考核
  2. SpringBoot+Thymeleaf+DataTables实现数据的查询与显示
  3. python3导入特定的成员
  4. java 技能鉴定_JAVA试题-技能鉴定
  5. 拿去用,常见几种加密算法的Python实现
  6. AjaxPro无刷新选择列表框/下拉框[方便|稳定]
  7. EXSi5.5安装篇
  8. Mongdb中常用的数据清洗
  9. 超图神经网络 Hypergraph Neural Networks
  10. OracleDBV工具说明
  11. 自然人税收管理系统服务器,【轻松学个税申报】自然人税收管理系统客户端操作...
  12. 优酷、爱奇艺视频码率与YouTube视频码率
  13. 轻量级web api_API接口管理,这15种开源工具助你管理API
  14. 去年我国出生率跌破1%,有什么影响?
  15. 如何用数学课件制作工具画函数切线
  16. 数据库技术之MVCC
  17. 如何管理和使用哪些命令操作MySQL数据库?(基本操作,SQL语言,DDL,DML,DQL,DCL,Windows字符和图形界面MySQL安装)
  18. 计算机操作系统的阶段分为几个阶段,浅谈操作系统的发展历程
  19. 东华软件张涵诚:政府大数据应用的案例和数据价值释放的方法
  20. 跨市场套利——策略简介与风险因素

热门文章

  1. Android学习第二天-android常用命令
  2. jsTree通过json数据初始化时,如何控制每个选项的图标(icon)显示
  3. MVC开发人员必备的五大工具
  4. CYQ.Data 轻量数据层之路 使用篇-MAction 取值赋值 视频[带音乐] F (二十四)
  5. 求一个整数n对16求商和余数
  6. 文件以附件形式下载的方法
  7. sharepoint ECMA
  8. python sqlalchemy mysql 自动映射
  9. Riot Games英雄联盟:卡尔莫甘娜的故事
  10. spring boot 使用swagger