96SEO 2026-02-19 17:55 11
二、服务调用1、创建配置zmall-cart购物车模块2、创建配置zmall-order订单模块3、服务调用三、spring

Session3、错误案例展示4、配置spring-session四、二级域名问题五、用户登录一、nginx动静分离
第1步通过SwitchHosts新增二级域名images.zmall.com
第2步将本次项目的易买网所有静态资源js/css/images复制到nginx中的html目录下
第3步在nginx的核心配置文件nginx.conf中新增二级域名images.zmall.com访问映射用于实现nginx动静分离
$http_x_forwarded_for;#access_log
$proxy_add_x_forwarded_for;location
$proxy_add_x_forwarded_for;client_max_body_size
http://127.0.0.1:8000/user-serv/;}
product.zmall.com;proxy_redirect
$proxy_add_x_forwarded_for;client_max_body_size
http://127.0.0.1:8000/product-serv/;}
$proxy_add_x_forwarded_for;client_max_body_size
http://127.0.0.1:8000/cart-serv/;}
$proxy_add_x_forwarded_for;client_max_body_size
http://127.0.0.1:8000/order-serv/;}
$proxy_add_x_forwarded_for;client_max_body_size
http://127.0.0.1:8000/play-serv/;}
$proxy_add_x_forwarded_for;client_max_body_size
http://127.0.0.1:8000/kill-serv/;}
http://images.zmall.com/css/style.css
第4步删除zmall-product商品服务和zmall-gateway网关服务下的static静态资源改用nginx中配置的静态资源
第5步修改zmall-product商品服务中的templates/common/head.html
ctx#--域名动态请求时需加入该前缀--http://product.zmall.com
#--采用H5方式的base标签在整个页面的url地址前加入用于访问nginx中的静态资源--
hrefhttp://images.zmall.com//第6步分别重启zmall-product、zmall-gateway以及nginx后输入请求地址zmall.com/product-serv/index.html访问商品服务首页如下所示
modules...modulezmall-cart/module...
parentgroupIdcom.zking.zmall/groupIdartifactIdzmall/artifactIdversion1.0-SNAPSHOT/version
artifactIdzmall-cart/artifactIddependenciesdependencygroupIdcom.zking.zmall/groupIdartifactIdzmall-common/artifactIdversion1.0-SNAPSHOT/version/dependency
/dependencies第4步配置application.yml端口8030
zmall-cartdatasource:#type连接池类型
DBCP,C3P0,Hikari,Druid,默认为Hikaritype:
com.zaxxer.hikari.HikariDataSourcedriver-class-name:
jdbc:mysql://localhost:3306/zmall?characterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghairewriteBatchedStatementstrueusername:
classpath:/templates/cloud:nacos:config:server-addr:
classpath*:/mapper/*Mapper.xml#别名包扫描路径type-aliases-package:
com.zking.zmall.modelconfiguration:#驼峰命名规则map-underscore-to-camel-case:
logging:level:com.zking.zmall.mapper:
debug第5步在启动类上加入EnableDiscoveryClient
第6步分别将购物车页面和common/head.html导入到templates目录并修改head.html中的ctx局部变量
ctx#--一级域名动态请求时需加入该前缀--http://cart.zmall.com
#--采用H5方式的base标签在整个页面的url地址前加入用于访问nginx中的静态资源--
hrefhttp://images.zmall.com//第7步在zmall-gateway网关服务中配置购物车的路由转发规则重启gateway网关服务
zmall-gatewaycloud:nacos:discovery:server-addr:
localhost:8848gateway:routes:...-
lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略predicates:-
StripPrefix1#此过滤器设置路由过滤器检查的请求属性以确定是否应发送原始主机头而不是由
PreserveHostHeader注意这里要配置过滤器PreserveHostHeader用于处理重定向时依然已原始主机头发送请求。
{RequestMapping(/cart.html)public
buyCar;}RequestMapping(/addCart)public
}注意这里使用redirect重定向方式跳转页面在SpringCloud
gateway路由转发过程中会导致域名跳转变成了http请求方式所以必须在Gateway网关服务中进行相关的配置。
具体请参考第8步的gateway网关路由配置。
第9步在zmall-product模块中修改加入购物车的请求方法定向到购物车
hrefhttp://cart.zmall.com/addCart?pid${(product.id)!}num3
classb_buy继续购物/a/td2、创建配置zmall-order订单模块
modules...modulezmall-order/module...
parentgroupIdcom.zking.zmall/groupIdartifactIdzmall/artifactIdversion1.0-SNAPSHOT/version
artifactIdzmall-order/artifactIddependenciesdependencygroupIdcom.zking.zmall/groupIdartifactIdzmall-common/artifactIdversion1.0-SNAPSHOT/version/dependency
/dependencies第4步配置application.yml端口8040
zmall-orderdatasource:#type连接池类型
DBCP,C3P0,Hikari,Druid,默认为Hikaritype:
com.zaxxer.hikari.HikariDataSourcedriver-class-name:
jdbc:mysql://localhost:3306/zmall?characterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghairewriteBatchedStatementstrueusername:
classpath:/templates/cloud:nacos:config:server-addr:
classpath*:/mapper/*Mapper.xml#别名包扫描路径type-aliases-package:
com.zking.zmall.modelconfiguration:#驼峰命名规则map-underscore-to-camel-case:
logging:level:com.zking.zmall.mapper:
debug第5步在启动类上加入EnableDiscoveryClient和MapperScan({com.zking.zmall.mapper})
第6步定义订单接口可从公共模块zmall-common中直接复制过来
orderService;RequestMapping(/orderUserList)ResponseBodypublic
QueryWrapperOrder().eq(userId,18));}
}第8步在zmall-gateway网关服务中配置购物车的路由转发规则重启gateway网关服务
zmall-gatewaycloud:nacos:discovery:server-addr:
localhost:8848gateway:routes:...-
lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略predicates:-
在zmall-user中通过openfeign方式访问order服务接口
{RequestMapping(/orderUserList)ListOrder
}启动类上设置EnableDiscoveryClient和EnableFeignClients调用接口并测试接口
orderFeignService;RequestMapping(/login.html)public
login;}RequestMapping(/order.html)ResponseBodypublic
orderFeignService.orderUserList();}
http://product.zmall.com/index.html
http://product.zmall.com/product.html?pid733
http://cart.zmall.com/cart.html
http://localhost:8010/order.html
SpringBoot整合Spring-Session的自动配置可谓是开箱即用极其简洁和方便。
这篇文章即介绍SpringBoot整合Spring-Session这里只介绍基于RedisSession的实战。
Session提供了用于管理用户会话信息的API和实现。
它把servlet容器实现的httpSession替换为spring-session专注于解决
session管理问题默认Session信息存储在Redis中可简单快速且无缝的集成到我们的应用中
session官网地址https://spring.io/projects/spring-session
提供用户session管理的API和实现提供HttpSession以中立的方式取代web容器的session比如tomcat中的session支持集群的session处理不必绑定到具体的web容器去解决集群下的session共享问题
SpringCloud微服务将一个完整的单体应用拆解成了一个个独立的子服务而每一个独立的微服务子模块都将部署到不同的服务器中而服务与服务之间是独立隔离的这个时候使用要实现服务与服务之间的session会话共享则需要借助于spring-session框架来解决分布式session管理与共享问题。
在用户服务zmall-user中编写登录控制器登录时创建session并将当前登录用户存储sesion中。
{RequestMapping(/login.html)public
session){session.setAttribute(username,admin);return
zmall-gatewaycloud:nacos:discovery:server-addr:
localhost:8848gateway:routes:...-
lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略predicates:-
PreserveHostHeader在商品服务zmall-product中编写查询控制器在登录创建session后使用将sessionId置于cookie中访问。
如果没有session将返回错误。
{RequestMapping(/index.html)public
session.getAttribute(username);System.out.println(**********username);return
http://localhost:8010/login.html
http://product.zmall.com/index.html
在公共模块zmall-common中引入spring-session的pom配置由于spring-boot包含spring-session的starter模块所以pom中依赖
注意公共模块作为所有微服务子模块的依赖支持如果不在各服务模块中配置redis支持会导致启动其他微服务时出现报错情况。
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
dependencygroupIdorg.springframework.session/groupIdartifactIdspring-session-data-redis/artifactId
dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId
/dependency分别在商品服务zmall-product和用户服务zmall-user中配置application.yml
spring:session:redis:flush-mode:
0重新启动zmall-user和zmall-product服务先访问http://zmall.com/user-serv/login.html然后在访问http://zmall.com/product-serv/index.html回到zmall-product模块控制台查看session获取情况。
测试在用户模块中保存用户信息然后在产品模块中读取,但是使用二级域名方式访问读取失败
请分别在用户服务和商品服务中该配置类解决二级域名访问session无效问题。
cookieSerializer(){DefaultCookieSerializer
DefaultCookieSerializer();cookieSerializer.setDomainName(zmall.com);cookieSerializer.setCookieName(ZMALLSESSION);return
springSessionDefaultRedisSerializer(){return
GenericJackson2JsonRedisSerializer();}
http://user.zmall.com/login.html
http://product.zmall.com/index.html
第1步在zmall-common公共模块中创建全局异常处理、响应封装类
第2步在zmall-user模块中定义IUserService及UserServiceImpl
{//1.判断用户账号和密码是否为空if(StringUtils.isEmpty(user.getLoginName())||StringUtils.isEmpty(user.getPassword()))return
JsonResponseBody(JsonResponseStatus.USERNAME_OR_PWD_EMPTY);//2.根据用户名查询数据对应的用户信息User
QueryWrapperUser().eq(loginName,
user.getLoginName()));//3.判断us用户对象是否为空if(nullus)return
JsonResponseBody(JsonResponseStatus.USERNAME_ERROR);try
pwdMD5Utils.md5Hex(user.getPassword().getBytes());//4.判断输入密码与数据库表存储密码是否一致if(!us.getPassword().equals(pwd)){return
JsonResponseBody(JsonResponseStatus.PASSWORD_ERROR);}}
JsonResponseBody(JsonResponseStatus.ERROR);}//5.通过UUID生成token令牌并保存到cookie中String
UUID.randomUUID().toString().replace(-,);//将随机生成的Token令牌保存到Cookie中并设置1800秒超时时间CookieUtils.setCookie(req,resp,token,token,7200);//6.将token令牌与spring
session进行绑定并存入redis中HttpSession
req.getSession();session.setAttribute(token,us);return
userService.userLogin(user,req,resp);
script$(function(){$(.log_btn).click(function(){let
password$(.l_pwd).val();if(loginName){alert(请输入用户名);return
false;}if(password){alert(请输入密码);return
false;}console.log({loginName:loginName,password:password});$.post(http://zmall.com/user-serv/userLogin,{loginName:loginName,password:password},function(rs){console.log(rs);if(rs.code200){location.hrefhttp://zmall.com/product-serv/index.html;}else{alert(rs.msg);}},json);});});
http://zmall.com/user-serv/login.html
jdbc:mysql://localhost:3306/zmall?useUnicodetruecharacterEncodingUTF-8useSSLfalseserverTimezoneUTC
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback