武冈网站建设,如何给自己网站做网站优化,做网站要用那些软件,网站开发综合实训心得登录方式调整
第1步#xff1a;从zmall-common的pom.xml中移除spring-session-data-redis依赖 注意#xff1a; 1#xff09;本次不采用spring-session方式#xff0c;改用redis直接存储用户登录信息#xff0c;主要是为了方便之后的jmeter压测#xff1b; 2#xff09…登录方式调整
第1步从zmall-common的pom.xml中移除spring-session-data-redis依赖 注意 1本次不采用spring-session方式改用redis直接存储用户登录信息主要是为了方便之后的jmeter压测 2这里只注释调用spring-session的依赖保留redis的依赖 第2步在zmall-common公共模块中定义RedisConfig配置类
Configuration
public class RedisConfig {Beanpublic RedisTemplateString,Object restTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplateString,Object redisTemplatenew RedisTemplate();//String类型Key序列化redisTemplate.setKeySerializer(new StringRedisSerializer());//String类型Value序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//Hash类型Key序列化redisTemplate.setHashKeySerializer(new StringRedisSerializer());//Hash类型Value序列化redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}第3步在zmall-common公共模块中配置redis相关服务
IRedisServcie
public interface IRedisService {/*** 将登陆用户对象保存到Redis中并以token来命名* param token* param user*/void setUserToRedis(String token, User user);/*** 根据token令牌从Redis中获取User对象* param token* return*/User getUserByToken(String token);
}RedisServcieImple
Service
public class RedisServiceImpl implements IRedisService {Autowiredprivate RedisTemplateString,Object redisTemplate;Overridepublic void setUserToRedis(String token, User user) {String keyuser:token;redisTemplate.boundValueOps(key).set(user,7200,TimeUnit.SECONDS);}Overridepublic User getUserByToken(String token) {return (User) redisTemplate.opsForValue().get(user:token);}
}用户登录成功后将用户对象保存到Redis中并设置超时时间7200秒。 第4步配置自定义参数解析UserArgumentResolver、WebConfig
UserArgumentResolver
/*** 自定义用户参数类*/
Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {Autowiredprivate IRedisService redisService;/*** 只有supportsParameter方法执行返回true才能执行下面的resolveArgument方法* param methodParameter* return*/Overridepublic boolean supportsParameter(MethodParameter methodParameter) {Class? type methodParameter.getParameterType();return type User.class;}Overridepublic Object resolveArgument(MethodParameter methodParameter,ModelAndViewContainer modelAndViewContainer,NativeWebRequest nativeWebRequest,WebDataBinderFactory webDataBinderFactory) throws Exception {HttpServletRequest req (HttpServletRequest) nativeWebRequest.getNativeRequest();//从cookie获取token令牌String token CookieUtils.getCookieValue(req, token);//判断cookie中的token令牌是否为空if(StringUtils.isEmpty(token))throw new BusinessException(JsonResponseStatus.TOKEN_ERROR);//根据token令牌获取redis中存储的user对象方便jmeter测试User user redisService.getUserByToken(token);if(nulluser)throw new BusinessException(JsonResponseStatus.TOKEN_ERROR);return user;}
}WebConfig
Component
public class WebConfig implements WebMvcConfigurer {Autowiredprivate UserArgumentResolver userArgumentResolver;Overridepublic void addArgumentResolvers(ListHandlerMethodArgumentResolver resolvers) {resolvers.add(userArgumentResolver);}Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//添加静态资源访问映射//registry.addResourceHandler(/static/**)// .addResourceLocations(classpath:/static/);}
}第5步用户登录业务调整将spring-session方式更改为redis方式存储登录用户信息。
//5.通过UUID生成token令牌并保存到cookie中
String token UUID.randomUUID().toString().replace(-,);
//将随机生成的Token令牌保存到Cookie中并设置1800秒超时时间
CookieUtils.setCookie(req,resp,token,token,7200);
//6.将token令牌与spring session进行绑定并存入redis中
//HttpSession session req.getSession();
//session.setAttribute(token,us);
//将token令牌与user绑定后存储到redis中方便jmeter测试
redisService.setUserToRedis(token,us);这里采用Redis方式直接存储登录用户信息只为后续使用Jmeter压测时提供便利。正常运行使用项目还是可以使用spring-session方式。 第6步修改商品服务zmall-product模块中的index方法将之前从HttpSession中获取登录用户信息改换成User对象参数方式
RequestMapping(/index.html)
public String index(Model model, User user){System.out.println(user);
}在调用index方法之前先由自定义的参数解析器进行参数解析并返回解析结果User所以在这里可直接在方法参数中获取的User对象。 第7步重启zmall-user和zmall-product模块完成用户登录后直接在浏览器地址栏输入http://zmall.com/product-serv/index.html查看zmall-product模块中的控制台是否已经获取到登录用户对象信息。 生成秒杀订单
绑定秒杀商品
添加sellDetail.html页面到zmall-product模块中实现首页秒杀商品展示必须保证秒杀商品状态为已激活、且秒杀商品的活动时间为有效时间范围之内。 #if kills??#list kills as gdiv classsell_${g_index?if_exists1}div classsb_imga href${ctx}/sellDetail.html?pid${g.id}img src${g.fileName} width242 height356 //a/divdiv classs_pricespan${g.price}/span/divdiv classs_nameh2a href${ctx}/sellDetail.html?pid${g.id}${g.name}/a/h2倒计时span1200/span 时 span30/span 分 span28/span 秒/div/div/#list/#if查看秒杀商品
点击限时秒杀中的秒杀商品根据秒杀商品ID查询秒杀商品详情信息并跳转到sellDetail.html页面展示秒杀商品信息。 订单秒杀
移除seata相关
第1步先注释掉zmall-order和zmall-product模块中的seata依赖
第2步分别删掉zmall-order和zmall-product模块中resources目录下的bootstrap.xml和register.conf文件
第3步移除zmall-order中分布式事务案例中的GlobalTransactional注解
第4步删除DataSourceProxyConfig该类
第5步移除zmall-order中启动类上的注解参数(exclude DataSourceAutoConfiguration.class)
//更改前
//SpringBootApplication(exclude DataSourceAutoConfiguration.class)
//更改后
SpringBootApplication
EnableDiscoveryClient
MapperScan({com.zking.zmall.mapper})
EnableFeignClients
public class ZmallOrderApplication {public static void main(String[] args) {SpringApplication.run(ZmallOrderApplication.class, args);}}
第6步更换zmall-order和zmall-product中的application.yml配置中的数据库连接池
datasource:#type连接池类型 DBCP,C3P0,Hikari,Druid,默认为Hikari#更改前#type: com.alibaba.druid.pool.DruidDataSource#更改后type: com.zaxxer.hikari.HikariDataSource生成秒杀订单
将SnowFlake雪花ID生成工具类导入到zmall-common模块中utils然后再生成秒杀订单时使用雪花ID来充当秒杀订单编号在zmall-order模块中完成秒杀订单生成工作。
IOrderService
public interface IOrderService extends IServiceOrder {JsonResponseBody? createKillOrder(User user, Integer pid);
}OrderServiceImpl
Transactional
Override
public JsonResponseBody? createKillOrder(User user, Integer pid) {//1.判断用户是否登录if(nulluser)throw new BusinessException(JsonResponseStatus.TOKEN_ERROR);//根据用户ID和秒杀商品Id判断。。。。//2.根据秒杀商品编号获取秒杀商品库存是否为空Kill kill killService.getOne(new QueryWrapperKill().eq(item_id,pid));if(kill.getTotal()1)throw new BusinessException(JsonResponseStatus.STOCK_EMPTY);//3.根据商品ID获取商品Product product productService.getProductById(pid);//4.秒杀商品库存减一killService.updateKillStockById(pid);//5.生成秒杀订单及订单项SnowFlake snowFlakenew SnowFlake(2,3);Long orderIdsnowFlake.nextId();//创建订单Order ordernew Order();order.setUserId(user.getId());order.setLoginName(user.getLoginName());order.setCost(product.getPrice());order.setSerialNumber(orderId);this.save(order);//创建订单项OrderDetail orderDetailnew OrderDetail();orderDetail.setOrderId(orderId);orderDetail.setProductId(product.getId());orderDetail.setQuantity(1);orderDetail.setCost(product.getPrice());orderDetailService.save(orderDetail);return new JsonResponseBody();
}前端页面秒杀测试
在sellDetail.html页面中添加订单秒杀JS方法。
script$(function(){$(.ch_a).click(function(){let pid$(this).attr(alt);console.log(pid);$.post(http://zmall.com/order-serv/createKillOrder,{pid:pid},function(rs){console.log(rs);if(rs.code200)alert(秒杀成功);elsealert(rs.msg);},json);});});
/script这里虽然已经能正常展示秒杀效果但是还是存在很多问题比如重复抢购问题等等问题。 utils:https://pan.baidu.com/s/1ExaC4GgEg_ofKsARkYhHXw 提取码kq20