jt我的项目局部具体业务代码介绍
1)业务介绍:
1.1)匿名拜访
~~~~
用户通过拜访jt.com进入jt首页,此时为匿名用户,若用户拜访购物车模块或者订单模块,拦截器将拦挡此申请,使其重定向到用户登录页面。
具体代码:
@Overridepublic 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单点登录模块代码详解:
@Overridepublic String doLogin(User user) { //username/password //1.将明文加密 String md5Pass = DigestUtils.md5DigestAsHex(user.getPassword().getBytes()); user.setPassword(md5Pass); QueryWrapper<User> 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")@ResponseBodypublic 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静态方法,当用户登出即销毁这个同步线程。