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

觉得自己做的网站土怎么办网站建设人员组成

觉得自己做的网站土怎么办,网站建设人员组成,wordpress集成api,做网站后台用什么语言Redis实现分布式会话 1 什么是分布式会话 1 这是我么之前学过的注册登录模式 2 如果非常多的人访问#xff0c;因为单台服务器的访问承受能力是有限的#xff0c;那么我们就想用多态服务器来承担压力 3 一般通过负载均衡的方式来实现#xff0c;来分担服务器的压力。 4 负…Redis实现分布式会话 1 什么是分布式会话 1 这是我么之前学过的注册登录模式 2 如果非常多的人访问因为单台服务器的访问承受能力是有限的那么我们就想用多态服务器来承担压力 3 一般通过负载均衡的方式来实现来分担服务器的压力。 4 负载均衡解释。 官方解释 网络专用术语负载均衡建立在现有网络结构之上它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 大白话nginx就是一个接受请求然后决定请求最终那个服务器来接受这个算法我们后面给大家讲nginx或者ribbon的时候给大家补充但是有时候会存在这样的问题用户1第一次请求到tomcat1, 下一次请求的时候就可能请求到tomcat2了这样会存在session丢失然后系统提示我们需要登录。 5 解决方案。 session 复制也就是当一个服务器有新的session保存的时候通过服务器通信机制然后将session复制到其他的服务器如果服务器较多的话会存在大量的网路和io占用效率低下。 redis实现session共享。 2 准备条件 1 导入资料中的代码 注意修改mysql和redis的地址 访问端口http://localhost:8081/shop-type/list 如果有数据显示说明项目部署成功。 2 导入前端代码 3 启动代码 在nginx所在目录下打开一个CMD窗口输入命令start nginx 输入http://127.0.0.1:8080 3 验证码 1 redis序列化配置 package com.xinzhi.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer;Configuration public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) {// 创建TemplateRedisTemplateString, Object redisTemplate new RedisTemplate();// 设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);// 设置序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer new GenericJackson2JsonRedisSerializer();// key和 hashKey采用 string序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// value和 hashValue采用 JSON序列化redisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);return redisTemplate;} } 2 controller PostMapping(code)public Result sendCode(RequestParam(phone) String phone, HttpSession session) {return userService.sendCode(phone, session);} 3 service public interface IUserService extends IServiceUser {Result sendCode(String phone, HttpSession session); } Service public class UserServiceImpl extends ServiceImplUserMapper, User implements IUserService {Resourceprivate RedisTemplate redisTemplate;Overridepublic Result sendCode(String phone, HttpSession session) {//1 校验手机号if(RegexUtils.isPhoneInvalid(phone)){//2 如果不符合返回错误消息return Result.fail(手机号格式错误);}// 3 生成验证码String code RandomUtil.randomNumbers(6);// 4 保存验证码到sessionsession.setAttribute(code,code);// 5 发送验证码,发送短信验证大家添加log.debug(验证码发送成功:code);return Result.ok();} } 验证码功能已经实现。 4 登录 1 controller /*** 登录功能* param loginForm 登录参数包含手机号、验证码或者手机号、密码*/PostMapping(/login)public Result login(RequestBody LoginFormDTO loginForm,HttpSession session){return userService.login(loginForm,session);} 2 service Override public Result login(LoginFormDTO loginForm, HttpSession session) {//1 校验手机号String phone loginForm.getPhone();if(RegexUtils.isPhoneInvalid(phone)){return Result.fail(手机号码格式错误);}// 2 从session中获取code并校验Object cacheCode session.getAttribute(code);if(cacheCodenull || !cacheCode.toString().equals(loginForm.getCode())){return Result.fail(验证码错误);}// 3 根据手机号查找用户User user query().eq(phone, phone).one();// 4 用户不存在则创建用户if(usernull){user createUserByPhone(phone);}// 5 用户保存到sessionsession.setAttribute(user, user);return Result.ok(); } private User createUserByPhone(String phone) {User user new User();user.setPhone(phone);user.setNickName(xinzhi_ RandomUtil.randomString(8));save(user);return user; } 3 创建intercepter包创建拦截器 package com.xinzhi.intercepter;import com.xinzhi.entity.User; import com.xinzhi.utils.UserHolder; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;public class LoginIntercepter implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1 获取sessionHttpSession session request.getSession();// 2 从session中获取user对象Object user session.getAttribute(user);// 3 判断session中时候有对象if(usernull){// 4 不存在的话设置401状态response.setStatus(401);return false;}//5 存在的话保存到threadlocal中UserHolder.saveUser((User)user);//6 放行return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserHolder.removeUser();} }4 将拦截器添加到 WebMvcConfigurer 中 WebMvcConfigurer是可以添加自定义拦截器消息转换器等 。 package com.xinzhi.config;import com.xinzhi.intercepter.LoginIntercepter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Configuration public class MvcConfig implements WebMvcConfigurer {Autowiredprivate RedisTemplateString, Object redisTemplate;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginIntercepter()).excludePathPatterns(/user/code,/user/login,/blog/hot,/shop-type/**,/shop/**,/upload/**,/voucher/**).order(1);} } 5 user/me处理 前端验证完成以后要跳转到user/me因为被拦截了 GetMapping(/me)public Result me(){User user UserHolder.getUser();return Result.ok(user); } 5 简单的反向代理 1 反向代理主要是修改nginx的配置文件 2 idea设置端口启动 同一个项目启动两个端口参考IDEA中使用--server.port端口号启动多个SpringBoot项目实例_在idea中server怎么有port-CSDN博客 3 发送短信验证码 4 结果我们虽然能输入正确的验证码但是还是不能登录。这是因为session不一致导致的。 6 token Token是在服务端产生的如果前端使用用户名/密码向服务端请求认证服务端认证成功那么在服务端会返回token给前端前端可以在每次请求的时候带上token证明自己的合法地位。如果这个 Token 在服务端持久化比如存入数据库那它就是一个永久的身份令牌。 参考什么是Token(令牌-CSDN博客 使用步骤 通过用户名和密码登录验证通过以后服务器会生成一个token(本质就是一个字符串)并且把token保存起来。 服务器会通过响应的方式将token返回给前端。 下次浏览器访问客户端的时候就会带着token一起过来并且和服务器的token对比如果相同则登录成功。 7 redis实现session共享 8 验证码改造 1 将验证码从之前的保存到session中改到保存到redis中因为存在多个用户登录的情况为了方便区分验证码是哪个手机发出的所以保存验证码的时候键可以用带有手机号的标志来保存。并且指定失效时间发短信的时候可以提示用户验证码有效期。 Override public Result sendCode(String phone, HttpSession session) {//1 校验手机号if(RegexUtils.isPhoneInvalid(phone)){//2 如果不符合返回错误消息return Result.fail(手机号格式错误);}// 3 生成验证码String code RandomUtil.randomNumbers(6);// 4 保存验证码到session//session.setAttribute(code,code);// 4 保存验证码到redisredisTemplate.opsForValue().set(login.code:phone, code,15,TimeUnit.MINUTES);// 5 发送验证码log.debug(验证码发送成功:code);return Result.ok(); } 9 登录改造 1 之前是从session中获取验证码现在验证码保存到redis中了所以验证码需要从redis获取 2 之前用户信息是保存到session中的现在需要保存到redis中。使用hash的方式但是user的属性比较多可以用map的方式直接保存到redis的hash结构中。 3 可以使用BeanUtil工具类将对象转成map类型。 4 因为需要给前端发送token所以需要随机生成一个token Override public Result login(LoginFormDTO loginForm, HttpSession session) {//1 校验手机号String phone loginForm.getPhone();if(RegexUtils.isPhoneInvalid(phone)){return Result.fail(手机号码格式错误);}// 2 从session中获取code并校验//Object cacheCode session.getAttribute(code);// 2 从redis中获取code并校验Object cacheCode redisTemplate.opsForValue().get(login.code: phone);System.out.println(cacheCode);if(cacheCodenull || !cacheCode.toString().equals(loginForm.getCode())){return Result.fail(验证码错误);}// 3 根据手机号查找用户User user query().eq(phone, phone).one();// 4 用户不存在则创建用户if(usernull){user createUserByPhone(phone);}// 5 用户保存到session// session.setAttribute(user, user);// 5 用户保存到redis//5.1生成token值String token UUID.randomUUID().toString(true);UserDTO userDTO BeanUtil.copyProperties(user, UserDTO.class);MapString, Object userMap BeanUtil.beanToMap(userDTO);//5.2 将用户信息保存到token中redisTemplate.opsForHash().putAll(login.token:token,userMap);// 5.3 设置token的过期时间redisTemplate.expire(login.token: token, 7, TimeUnit.DAYS);//6 将token返回给前端return Result.ok(token); } private User createUserByPhone(String phone) {User user new User();user.setPhone(phone);user.setNickName(xinzhi_ RandomUtil.randomString(8));save(user);return user; } 5 前端以后访问的时候在请求头里面带上了token 6 拦截器获取前端 package com.xinzhi.intercepter;import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.xinzhi.entity.User; import com.xinzhi.utils.UserHolder; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.Map;public class LoginIntercepter implements HandlerInterceptor {private RedisTemplateString, Object redisTemplate;public LoginIntercepter(RedisTemplateString, Object redisTemplate) {this.redisTemplate redisTemplate;}Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1 获取session// HttpSession session request.getSession();// 1 从请求头中获取tokenString token request.getHeader(authorization);// 2 如果前端没有带token,直接给失败的响应if(StrUtil.isBlank(token)){response.setStatus(401);return false;}// 2 从session中获取user对象//Object user session.getAttribute(user);// 3 获取redis中的用户对象String key login.token: token;MapObject, Object userMap redisTemplate.opsForHash().entries(key);// 4 判断redis中的对象if(userMap.isEmpty()){// 5 不存在的话设置401状态response.setStatus(401);return false;}System.out.println(拦截器中的user:userMap);// 6 将userMap转成user对象User user BeanUtil.fillBeanWithMap(userMap, new User(), true);//7 存在的话保存到threadlocal中UserHolder.saveUser(user);//8 放行return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserHolder.removeUser();} } 10 可以同时访问两个服务器。
http://www.w-s-a.com/news/586722/

相关文章:

  • 网站成立时间查询墨猴seo排名公司
  • 技术支持 随州网站建设苏州企业网站建设定制
  • 美食网站开发目的与意义网站开发环境选择
  • 青岛西海岸新区城市建设局网站开发板在null不可用
  • 企业信息管理系统免费seo优化个人博客
  • 做任务的设计网站泰州哪里做网站
  • 什么网站可以做设计赚钱吗南京十大软件公司排名
  • 网站开发时间进度北京有哪些著名网站
  • 深圳比较好的设计网站公司自己的网站到期域名如何续费
  • 温州做网站哪儿新云网站模版
  • 网站开发 视频存在哪检察院前期网站建设
  • 备案中的网站信息怎么填如何做分享赚钱的网站
  • 网站行程表怎么做注册公司费用要多少
  • 常见电子商务网站基本模式南山网站公司定
  • 网站搭建代码网站里面送礼物要钱怎么做代码
  • 大学英文网站建设举措wordpress 学院 模板
  • 爱 做 网站吗php网站作业模版
  • wordpress代码乱吗台州做网站seo的
  • 做ptt网站wordpress中文企业网站
  • 深圳雨棚制作深圳 网站优化公司排名
  • 深圳优秀网站建设价格wordpress没人用
  • 国企网站建设需要注意沈阳招标信息网
  • 东莞360推广的网站是谁做的上海网络推广产品
  • 网站可以换主机吗中国十大网站建设企业
  • 怎么做盗版小说网站官网做有下拉列表的网站的图片
  • 邢台网站建设电话网站界面类型
  • 网站制作合同模板做一个网站能挣多少钱
  • 汶上1500元网站建设互联网高端官网
  • 广州做公司网站网站开发培训机构
  • 网站建设与维护 课件网页版qq安全中心登录入口