jt项目部分详细业务代码介绍
1)业务介绍:
1.1)匿名访问
用户通过访问jt.com进入jt首页,此时为匿名用户,若用户访问购物车模块或者订单模块,拦截器将拦截此请求,使其重定向到用户登录页面。
具体代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.判断用户是否登录 检查cookie是否有值
String ticket = CookieUtil.getCookieValue(request,"JT_TICKET");
//2.校验ticket
if(!StringUtils.isEmpty(ticket)){
//3.判断redis中是否有值.
if(jedisCluster.exists(ticket)){
//4.动态获取json信息
String userJSON = jedisCluster.get(ticket);
User user = ObjectMapperUtil.toObj(userJSON,User.class);
UserThreadLocal.set(user);
return true;
}
}
response.sendRedirect("/user/login.html");
return false;
}
将拦截器交给WebMvcConfigurer接口的配置类中实现
拦截器中制定了特定的url进行拦截,非此类url进行放行
代码实现:
@Configuration //web.xml配置文件
public class MvcConfigurer implements WebMvcConfigurer{
//开启匹配后缀型配置
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
//开启后缀类型的匹配. xxxx.html
configurer.setUseSuffixPatternMatch(true);
}
@Autowired
private UserInterceptor userInterceptor;
//添加拦截器功能
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userInterceptor)
.addPathPatterns("/cart/**","/order/**");
}
}
若用户尚未登录,其中并不会有一个名为"JT_TICKET"的Cookie会话产生,拦截器将拦截下请求并重定向到用户登录页面
1.2)用户登录
当用户登录时,客户端向服务端发送登录请求,进入jt-web的Controller层,由dubbo微服务框架进行RPC远程调用,调用实现了公共接口的jt-sso单点登录系统中的UserServiceImpl登录方法,具体代码如下:
jt-sso单点登录模块代码详解:
@Override
public String doLogin(User user) { //username/password
//1.将明文加密
String md5Pass =
DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
user.setPassword(md5Pass);
QueryWrapper queryWrapper = new QueryWrapper<>(user);
//根据对象中不为null的属性当做where条件.
User userDB = userMapper.selectOne(queryWrapper);
if(userDB == null){
//用户名或密码错误
return null;
}else{ //用户名和密码正确 实现单点登录操作
String ticket = UUID.randomUUID().toString();
//如果将数据保存到第三方 一般需要脱敏处理
userDB.setPassword("123456你信不??");
String userJSON = ObjectMapperUtil.toJSON(userDB);
jedisCluster.setex(ticket, 7*24*60*60, userJSON);
return ticket;
}
}
将代码进行加密处理,并返回用户对象,如若加密后的密码与数据库中的相符,即账号密码正确,则返回一个User对象,因redis是第三方软件,需要对返回的对象进行脱敏处理,并将处理后的用户对象转化为Json格式并储存到redis集群中,最后返回一个UUID方法生成的ticket随机的值;数据库查询返回的对象为null,即密码不正确,返回一个null即可。
jt-web前端页面模块代码详解:
@RequestMapping("/doLogin")
@ResponseBody
public SysResult doLogin(User user, HttpServletResponse response){
String ticket = userService.doLogin(user);
if(StringUtils.isEmpty(ticket)){
//说明用户名或者密码错误
return SysResult.fail();
}else{
//1.创建Cookie
/*Cookie cookie = new Cookie("JT_TICKET",ticket); cookie.setMaxAge(7*24*60*60); //设定cookie存活有效期
cookie.setPath("/"); //设定cookie有效范围
cookie.setDomain("jt.com"); //设定cookie共享的域名 是实现单点登录必备要素
response.addCookie(cookie);*/
CookieUtil.addCookie(response, "JT_TICKET",ticket,7*24*60*60,"jt.com");
return SysResult.success(); //表示用户登录成功!!
}
}
如若jt-web RPC远程调用jt-sso中登录操作返回的ticket非空,即账号密码正确,则创建一个域名共享的会话,以便后续的订单、购物车模块使用。
1.3)已登录
若用户已登录,必定会创建用户会话和将用户(User)对象储存到redis中,并且在HandlerInterceptor拦截器实现类UserInterceptor中创建一个ThreadLocal同步线程,并将User对象储存到UserInterceptor的静态方法中,并对外提供获取User的get静态方法,当用户登出即销毁这个同步线程。