有什么方法在淘宝发布网站建设设计网站建设公开

当前位置: 首页 > news >正文

有什么方法在淘宝发布网站建设设计,网站建设公开,北京南站最新消息,返利 wordpress一、登录注册模块 1、注册功能 1.1、注册流程图 1.2、注册代码 /*** 用户注册* param user* return MapString, Object 返回错误提示消息#xff0c;如果返回的 map 为空#xff0c;则说明注册成功/public MapString, Object register(User user) {Mapparam user return MapString, Object 返回错误提示消息如果返回的 map 为空则说明注册成功*/public MapString, Object register(User user) {MapString, Object map new HashMap();if (user null) {throw new IllegalArgumentException(参数不能为空);}if (StringUtils.isBlank(user.getUsername())) {map.put(usernameMsg, 账号不能为空);return map;}if (StringUtils.isBlank(user.getPassword())) {map.put(passwordMsg, 密码不能为空);return map;}if (StringUtils.isBlank(user.getEmail())) {map.put(emailMsg, 邮箱不能为空);return map;}// 验证账号是否已存在User u userMapper.selectByName(user.getUsername());if (u ! null) {map.put(usernameMsg, 该账号已存在);return map;}// 验证邮箱是否已存在u userMapper.selectByEmail(user.getEmail());if (u ! null) {map.put(emailMsg, 该邮箱已被注册);return map;}// 注册用户user.setSalt(CommunityUtil.generateUUID().substring(0, 5)); // saltuser.setPassword(CommunityUtil.md5(user.getPassword() user.getSalt())); // 加盐加密user.setType(0); // 默认普通用户user.setStatus(0); // 默认未激活user.setActivationCode(CommunityUtil.generateUUID()); // 激活码// 随机头像用户登录后可以自行修改user.setHeaderUrl(String.format(http://images.nowcoder.com/head/%dt.png, new Random().nextInt(1000)));user.setCreateTime(new Date()); // 注册时间userMapper.insertUser(user);// 给注册用户发送激活邮件Context context new Context();context.setVariable(email, user.getEmail());// http://localhost:8080/echo/activation/用户id/激活码String url domain contextPath /activation/ user.getId() / user.getActivationCode();context.setVariable(url, url);String content templateEngine.process(/mail/activation, context);mailClient.sendMail(user.getEmail(),激活 Echo 账号, content);return map;} 2、登录模块 2.1、登录页面 2.2、登录验证码问题 首先登录的时候会随机生成验证码如何把这个验证码和当前用户对应起来实现验证码的校验呢 显然由于这个时候用户还没有登录我们是没有办法通过用户的 id 来唯一的对应它的验证码的。所以这个时候我们考虑生成一个随机的 id 来暂时的代替这个用户将其id和对应的验证码暂时存入 Redis 中60s。并且在 Cookie中暂时存一份为这个用户生成的随机 id60s。 其中生成验证码和进行校验分别是两个URL请求地址。 这样当用户点击登录按钮后就会去 Redis中获取这个随机 id和验证码去Cookie查询对应的验证码判断用户输入的验证码是否一致。 2.3、登录认证并持有用户状态问题 用户输入用户名和密码并且校验完验证码之后就登录成功了那我们如何在一次请求中去保存这个用户的状态如何回显用户的信息呢 做法可以设计一个类如下图 解释一下每个用户登录成功后我们都会为其生成一个随机的唯一的登录凭证实体类对象 LoginTicket包含用户 id、登录凭证字符串 ticket、是否有效、过期时间我们把这个登录凭证实体类对象永久的存储在 Redis 中key 就是登录凭证字符串 ticket。而所谓登录凭证的无效就是指用户登出后这个凭证就会被设置为无效状态凭证的默认过期时间是 30分。 存储完 LoginTicket 后我们就可以根据它来获取用户的状态了。我们定义了一个拦截器 LoginTicketInterceptor每次请求之前都会从 Redis获取到 ticket然后根据 ticket 去 Redis 中查看这个用户的登录凭证 LoginTicket 是否过期和是否有效只有登录凭证有效且没有过期才会执行请求不然就会跳转到登录界面。 如果该用户的登录凭证有效且没有过期那我们就可以在本次请求中持有这个用户的信息了。如何持有呢这里我们考虑使用 ThreadLocal 保存用户信息ThreadLocal 在每个线程中都创建了一个用户信息副本也就是说每个线程都可以访问自己内部的用户信息副本变量从而实现了线程隔离来看下 HostHolder 类 所以将登录成功后要保存的信息为 将生成的凭证保存到Redis上并且设置过期时间置state为1其中key为凭证value为LoginTicket 类。 然后每次请求首先经过拦截器通过Cookie获取ticket凭证。凭借ticket凭证从Redis获取LoginTicket 类的信息。如果存在就将通过LoginTicket 类的用户id查询用户信息其保存到ThreadLocal中否则拦截。 2.4、退出功能 从Redis删除凭证信息执行ThreadLocal的remove()方法清空用户信息删除Cookie保存的凭证信息。 2.5、性能优化 因为每次请求需要在拦截器中通过通过Cookie获取凭证然后去Redis获取LoginTicket 类。如果通过验证则会每次去数据库查询用户信息这样导致每一次请求访问都会去数据库查询造成巨大的访问压力。 为了避免这种情况所以拦截器首先去Redis查询用户信息如果有则直接保存到ThreadLocal否则再去数据库查询用户信息再保存到Redis中。 2.5、流程 用户登录 — 生成登录凭证作为key存入 Redisvalue是凭证类信息Cookie 中存一份 ticket凭证每次执行请求之前拦截器都会通过 Cookie 去 Redis 中查询该用户的登陆凭证是否过期和是否有效。点击记住我可以延长登录凭证的过期时间用户退出则其登录凭证变为无效状态根据这个登录凭证对应的用户 id去数据库中查询这个用户信息使用 ThreadLocal 在本次请求中一直持有这个用户信息优化点每次请求前都需要去数据库查询这个用户信息访问频率比较高所以我们考虑把登录成功的用户信息在 Redis 中保存一会拦截器每次查询前先去 Redis 中查询 流程图如下图 二、帖子模块 三、评论模块 四、私信模块 五、点赞模块 六、系统通知模块