jt项目部分详细业务代码介绍1)业务介绍:1.1)匿名访问~~~~用户通过访问jt.com进入jt主页。此时,他是匿名用户。如果用户访问购物车模块或订单模块,拦截器将拦截该请求,使其重定向到用户登录页面。具体代码:@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{//1.判断用户是否登录,检查cookie是否有值Stringticket=CookieUtil.getCookieValue(request,"JT_TICKET");//2.Checkticketif(!StringUtils.isEmpty(ticket)){//3.判断redis中是否有值。if(jedisCluster.exists(ticket)){//4.动态获取json信息StringuserJSON=jedisCluster.get(ticket);用户user=ObjectMapperUtil.toObj(userJSON,User.class);UserThreadLocal.set(用户);返回真;}}response.sendRedirect("/user/login.html");returnfalse;}将拦截器在WebMvcConfigurer接口的配置类中指定具体的url进行拦截,非此类url放行代码实现:@Configuration//web.xml配置文件publicclassMvcConfigurerimplementsWebMvcConfigurer{//启用匹配后缀类型配置@OverridepublicvoidconfigurePathMatch(PathMatchConfigurerconfigurer){//启用后缀类型匹配。xxxx.htmlconfigurer.setUseSuffixPatternMatch(true);}@Autowired私有UserIntercep用户拦截器;//添加拦截器函数@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(userInterceptor).addPathPatterns("/cart/**","/order/**");}}如果用户没有登录,则不会有名为“JT_TICKET”的cookie会话,拦截器会拦截请求并重定向到用户登录页面1.2)用户登录当用户登录时,客户端发送登录请求到服务器,进入jt-web的Controller层,通过dubbo微服务框架进行RPC远程调用,调用实现公共接口的jt-sso单点登录系统中的UserServiceImpl登录方法.具体代码如下:jt-sso单点登录模块代码详解:@OverridepublicStringdoLogin(Useruser){//用户名/密码//1.加密明文Stringmd5Pass=DigestUtils.md5DigestAsHex(user.getPassword().getBytes());user.setPassword(md5Pass);QueryWrapper<用户>queryWrapper=newQueryWrapper<>(用户);//根据对象中的非空属性作为where条件。用户userDB=userMapper.selectOne(queryWrapper);if(userDB==null){//用户名或密码错误returnnull;}else{//用户名密码正确,实现单点登录操作Stringticket=UUID.randomUUID().toString();//如果数据保存到第三方,一般需要脱敏userDB.setPassword("123456你的信件号码??");斯特里nguserJSON=ObjectMapperUtil.toJSON(userDB);jedisCluster.setex(ticket,7*24*60*60,userJSON);往返票;}}对代码进行加密,返回用户对象,比如加密后的密码与数据库匹配,即账号密码正确,则返回一个User对象。由于redis是第三方软件,需要对返回的对象进行脱敏处理,将处理后的用户对象转成Json格式存储到redis集群中。最后,返回UUID方法生成的ticket的一个随机值;数据库查询返回的对象为null,即密码不正确,返回一个null即可jt-web前端页面模块代码详解:@RequestMapping("/doLogin")@ResponseBodypublicSysResultdoLogin(Useruser,HttpServletResponseresponse){Stringticket=userService.doLogin(user);if(StringUtils.isEmpty(ticket)){//说明用户名或密码错误returnSysResult.fail();}其他{//1。创建Cookie/*Cookiecookie=newCookie("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");返回SysResult.success();//表示用户登录成功!!}}如果jt-webRPC远程调用jt-sso登录操作,返回非空ticket,即账号密码正确,为后续的订单和购物车模块创建域名共享session。1.3)登录如果用户登录了,会创建一个用户会话并将用户(User)对象存入redis,在HandlerInterceptor拦截器实现类UserInterceptor中创建一个ThreadLocal同步线程,并将User对象会在UserInterceptor方法中保存静态,并提供get静态方法获取User,当用户注销时,同步线程会被销毁。
