[springboot 开发单体web shop] 5. 用户登录及首页展示 (2)

CookieTools.setCookie();
之前我们有提过,一般情况下,我们用户登录之后,数据都会被存储在本地浏览器Cookie中,比如我登录的baidu.com:

baidu


此时,鼠标在图片中左侧的Cookies => 右键clear,然后再次刷新我们当前界面,效果如下:

clear cookies


我们可以看到,从登录状态已经变为退出状态了,并且Cookies中的内容也少了很多,这就说明,百度是把我们的用户登录信息加密后存储在了浏览器cookie中。
大家可以查看京东,淘宝等等,也是基于这种方式实现的,开篇之初就说过,我们的系统是基于生产来实现的demo,那么我们就是用主流的实现方法来做。当然,有的同学会说,这个应该我们把数据传递给前端,让前端来实现的!!!当然,你说的对,可是我们掌握一种实现方式,对于我们个人而言应该是没有坏处的吧?
这里就需要一个工具类了,大家可以在github传送门来下载相关代码。目录com.liferunner.utils.CookieTools.

com.alibaba.fastjson.JSON.toJSONString(userResponseDTO)
因为我们要返回的是一个对象,但是cookie中我们需要放入的是String,这里我们引入了alibaba的JSON工具,在mscx-shop-common/pom.xml,加入依赖:

<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.56</version> </dependency> </dependencies>

用户登出

在用户操作结束之后,我们需要将用户从系统中退出登录,因为我们的用户登录信息会存储在浏览器cookie中,因此,我们需要根据用户的登出操作来删除相关用户缓存:

@ApiOperation(value = "用户登出",notes = "用户登出",httpMethod = "POST") @PostMapping("/logout") public JsonResponse userLogout(@RequestParam String uid, HttpServletRequest request,HttpServletResponse response){ // clear front's user cookies CookieTools.deleteCookie(request,response,"user"); // return operational result return JsonResponse.ok(); } 开发调试小福利 java日志追踪

一般在电商场景中,对于请求的响应时间有着极其严格的要求,比如你在一个网站买商品的时候,如果每点击一次按钮都要等待,或者系统感觉卡顿一下,你会毫不犹豫的选择右上角的小红叉,把它干掉。因此,在我们系统的开发过程中,很多时候需要对我们的请求响应时间进行监控,甚至会通过压力测试来进行测试。但是,让我们在每一个方法中都做这种请求的实现,显然是不合理甚至说是让开发人员难受的,所以,我们来实现一种通用的做法,那就是通过AOP,面向切面来实现。关于切面的基本使用,大家可以参考AOP传送门,接下来,开始我们的编码。
根据springboot实现功能三部曲:
setp 1. 添加依赖

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

step 2. 启动配置(没有就忽略掉这一步)
setp 3. 加注解
在我们的mscx-shop-api项目中,创建com.liferunner.api.aspectpackage,然后创建com.liferunner.api.aspect.CommonLogAspect,代码如下:

package com.liferunner.api.aspect; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import java.util.Date; /** * CommonLogAspect for : AOP切面实现日志确认 * * @author <a href="http://www.likecs.com/mailto:magicianisaac@gmail.com">Isaac.Zhang | 若初</a> * @since 2019/11/11 */ @Component @Aspect @Slf4j public class CommonLogAspect { @Around("execution(* com.liferunner.api.controller..*.*(..))") public void recordLogTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { log.info("----------- {}.{} process log time started.---------------", proceedingJoinPoint.getTarget().getClass(), proceedingJoinPoint.getSignature().getName()); val startTime = System.currentTimeMillis(); proceedingJoinPoint.proceed(); val afterTime = System.currentTimeMillis(); if (afterTime - startTime > 1000) { log.warn("cost : {}", afterTime - startTime); } else { log.info("cost : {}", afterTime - startTime); } log.info("----------- {}.{} process log time ended.---------------", proceedingJoinPoint.getSourceLocation().getClass(), proceedingJoinPoint.getSignature().getName()); } }

第一行日志代表我们想要监控的是哪个类的哪个方法

proceedingJoinPoint.proceed();表示方法执行

当请求查过1000ms的时候,我们使用log.warn(...)进行日志告警

step 4. 效果演示

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyfzy.html