关于java:JT-day01

66次阅读

共计 2836 个字符,预计需要花费 8 分钟才能阅读完成。

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<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")
@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 静态方法,当用户登出即销毁这个同步线程。

正文完
 0