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

业务型网站首页网页设计说明万能模板

业务型网站首页,网页设计说明万能模板,wordpress文章多密码,阜沙网站建设黑马点评1 短信登录 基于Session实现登录流程 发送验证码#xff1a; 用户在提交手机号后#xff0c;会校验手机号是否合法#xff0c;如果不合法#xff0c;则要求用户重新输入手机号 如果手机号合法#xff0c;后台此时生成对应的验证码#xff0c;同时将验证码进行…黑马点评1 短信登录 基于Session实现登录流程 发送验证码 用户在提交手机号后会校验手机号是否合法如果不合法则要求用户重新输入手机号 如果手机号合法后台此时生成对应的验证码同时将验证码进行保存然后再通过短信的方式将验证码发送给用户 短信验证码登录、注册 用户将验证码和手机号进行输入后台从session中拿到当前验证码然后和用户输入的验证码进行校验如果不一致则无法通过校验如果一致则后台根据手机号查询用户如果用户不存在则为用户创建账号信息保存到数据库无论是否存在都会将用户信息保存到session中方便后续获得当前登录信息 校验登录状态: 用户在请求时候会从cookie中携带者JsessionId到后台后台通过JsessionId从session中拿到用户信息如果没有session信息则进行拦截如果有session信息则将用户信息保存到threadLocal中并且放行 发送验证码 Overridepublic Result sendCode(String phone, HttpSession session) {//校验 手机号if (RegexUtils.isPhoneInvalid(phone)) {//不符合return Result.fail(手机号格式不正确);}//生成验证码String code RandomUtil.randomNumbers(6);//保存到sessionsession.setAttribute(code, code);//发送验证码log.debug(手机号{}验证码{}, phone, code);return Result.ok();}用户登录 Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//校验手机号String phone loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)) {//不符合return Result.fail(手机号格式不正确);}//校验验证码Object hasSendCode session.getAttribute(code);String code loginForm.getCode();if (hasSendCode null || !hasSendCode.toString().equals(code)) {return Result.fail(验证码不正确);}//校验通过查询用户User user this.query().eq(phone, phone).one();if (user null) {user createUserWithPhone(phone);}//保存用户信息到sessionsession.setAttribute(user, user);return Result.ok();}private User createUserWithPhone(String phone) {User user new User();user.setPhone(phone);user.setNickName(USER_NICK_NAME_PREFIX RandomUtil.randomString(10));this.save(user);return user;}此时可以正常登录 手机号格式 手机号以 “1” 开头。第二位是一个特定的数字可以是 3、4、5、6、7、8、9 中的一个。接下来的 9 位数字可以是 0 到 9 的任意数字。 登录拦截 添加拦截器设置 public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取SessionHttpSession session request.getSession();//获取用户信息Object user session.getAttribute(user);if (user null) {//不存在拦截返回401状态码response.setStatus(401);return false;}//存在保存到ThreadLocal中UserHolder.saveUser((User) user);return true;} }配置拦截器生效 Configuration public class MvcConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns(/shop/**,/shop/**,/voucher/**,/shop-type/**,/upload/**,/blog/hot,/user/code,/user/login);} }用户信息脱敏 登录的时候修改 //保存用户信息到sessionUserDTO userDTO BeanUtil.copyProperties(user, UserDTO.class);session.setAttribute(user, userDTO);return Result.ok();拦截器修改 //存在保存到ThreadLocal中UserHolder.saveUser((UserDTO) user);UserHolder修改 public class UserHolder {private static final ThreadLocalUserDTO tl new ThreadLocal();public static void saveUser(UserDTO user){tl.set(user);}public static UserDTO getUser(){return tl.get();}public static void removeUser(){tl.remove();} }Session共享 session会存入到tomcat服务器 中但是后端如果有多个tomcat服务器就不好 实现数据共享早期的办法是将 session拷贝到不同 的tomcat服务器上面现在有了redis可以直接使用redis来解决session共享的问题两种存储方式 使用string存储使用哈希存储 这里选择使用哈希存储 设计key的时候可以随机 生成一个token给 前端让前端带着token来访问后端 整体流程如下 修改发送验证码逻辑保存到redis Overridepublic Result sendCode(String phone, HttpSession session) {//校验 手机号if (RegexUtils.isPhoneInvalid(phone)) {//不符合return Result.fail(手机号格式不正确);}//生成验证码String code RandomUtil.randomNumbers(6);//保存到sessionstringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);//发送验证码log.debug(手机号{}验证码{}, phone, code);return Result.ok();}修改登录逻辑,从redis读数据 Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//校验手机号String phone loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)) {//不符合return Result.fail(手机号格式不正确);}//从redis中获取验证码String hasSendCode stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY phone);String code loginForm.getCode();if (hasSendCode null || !hasSendCode.toString().equals(code)) {return Result.fail(验证码不正确);}//校验通过查询用户User user this.query().eq(phone, phone).one();if (user null) {user createUserWithPhone(phone);}//保存用户信息到redis中//生成tokenString token UUID.randomUUID().toString();//将User对象转为HashMap存储UserDTO userDTO BeanUtil.copyProperties(user, UserDTO.class);MapString, Object userMap BeanUtil.beanToMap(userDTO, new HashMap(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldvalue) - fieldvalue.toString()));//存储String toKenKey LOGIN_USER_KEY token;stringRedisTemplate.opsForHash().putAll(toKenKey, userMap);//设置有效期stringRedisTemplate.expire(toKenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);return Result.ok(token);}解决登录状态刷新问题 目前的拦截机制 如果访问不需要拦截的路径这个拦截器不会生效此时不会刷新令牌 优化方案 再添加一个拦截器拦截所有请求 具体代码以及解释 如下 public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;//这里的构造方法是为了注入StringRedisTemplate// 因为 RefreshTokenInterceptor 是自己 new 出来的不是 Spring 管理的public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplate;}Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取请求头中的tokenString token request.getHeader(authorization);if (StrUtil.isBlank(token)) {return true;}//获取redis中的用户String key LOGIN_USER_KEY token;MapObject, Object userMap stringRedisTemplate.opsForHash().entries(key);if (userMap.isEmpty()) {//用户不存在return true;}//将hash数据转为UserDTOUserDTO userDTO BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//保存到ThreadLocal中UserHolder.saveUser(userDTO);//刷新token有效期stringRedisTemplate.expire(key, LOGIN_USER_TTL, java.util.concurrent.TimeUnit.DAYS);return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//清空ThreadLocal中的数据 防止内存泄漏UserHolder.removeUser();} } 配置类里面注入StringRedisTemplate Configuration public class MvcConfig implements WebMvcConfigurer {Resourceprivate StringRedisTemplate stringRedisTemplate;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).addPathPatterns(/**);registry.addInterceptor(new LoginInterceptor()).excludePathPatterns(/shop/**,/voucher/**,/shop-type/**,/upload/**,/blog/hot,/user/code,/user/login);} }登录拦截器修改如下 public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (UserHolder.getUser() null) {//不存在拦截返回401状态码response.setStatus(401);return false;}//有用户return true;} }至此黑马点评的登录逻辑完成。
http://www.hkea.cn/news/14413914/

相关文章:

  • 公司网站建设如何撤销wordpress著名案例
  • 东莞网站优化建设团队app公司网站建设
  • 云南做网站哪家好网站模版设计
  • wordpress搭建企业网站思路江苏省交通建设局网站
  • 深圳模板网站建设公司微信公众好可以上传wordpress
  • 石家庄做商城网站的公司网站搭建费用计入什么科目
  • 制作会员手机网站个人网页设计论文正文
  • 深圳企业网站制作企业百度点击器下载
  • php 网站网页设计与制作教程考试题目
  • 如何做团购网站吉安网站建设优化服务
  • 台州做网站seo的网站推广过程
  • 广东官网网站建设公司网站移动端自适应
  • 深圳腾网站建设北京核心词优化市场
  • 花生壳做局域网站网站建设要做些什么问题
  • 做酒店网站的公司求职seo服务
  • 做外贸哪个网站看外汇网络服务类型及其采用的网络协议
  • 电子商务网站建设的心得网站外包哪家公司好
  • 网站排名北京建设厅网站首页
  • 单页面营销网站宁夏电建网站
  • 国外活动策划网站商城网站功能列表
  • 网站建设完工确认书计算机网页怎么制作
  • 免费个人网站怎么建立步骤怎么建立淘宝客网站
  • 中国医院考试网站模板下载网站做的漂亮的企业
  • 岱山县网站建设做网站的主营业务
  • 网站导航字体海南网站优化
  • 图片发到哪些网站 seo直播软件排行榜2020
  • 腾讯官方网站长沙园林景观设计公司排名
  • 网站建设交接表网站开发需求文档prd模板
  • 询盘网站招商网站大全
  • 网站标题设置青岛知名网站建设公司