8.解决session 问题
https://blog.csdn.net/u012383839/article/details/79756368
1session 的复制问题,session的配置文件的问题:
具体的配置的问题:
<cluster classname="org.apache.cataliine.ha.tcp.Simple" chanbekSendOption=''8'>
<!-- 第1步:修改server.xml,在Host节点下添加如下Cluster节点 -->
<!-- 用于Session复制 -->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" />
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4"
port="45564" frequency="500" dropTime="3000" />
<!-- 这里如果启动出现异常,则可以尝试把address中的"auto"改为"localhost" -->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000"
autoBind="100" selectorTimeout="5000" maxThreads="6" />
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor" />
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false" />
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
<!-- 第2步:在web.xml中添加如下节点 -->
<!-- 用于Session复制 -->
<distributable/>
最终的tomcat的log中可能会打印如下的信息:
3.方案2:使用第三方的(个人的)基于tomact实现的session 管理的
这里的github 上的tomcat -redis -manager来实现。
项目地址:http://github.com/jcoleman/tomcat-redis-session-manager
方案3: 使用spring session 实现
spring session 提供了多种方式来存储的session信息,包括redis .mongo,gemfile,hazelcast,jdbc等。这里使用 redis 来举例说明:
首先进行依赖添加,然后惊醒配置即可。
4.1 添加依赖
compile "org.springframework.session:spring-session-data-redis:1.3.2.RELEASE"
注意:当引入上述依赖包时,还会引入如下依赖:
org.apache.commons:commons-pool2:2.4.2
org.springframework.data:spring-data-redis:1.7.10.RELEASE
org.springframework.session:spring-session:1.3.2.RELEASE
redis.clients:jedis:2.8.1
项目中原来使用了Redis作为Spring Cache的实现,当时使用的spring-data-redis是1.4.2.RELEASE版本,现在使用1.7.10.RELEASE版本后,需要把cacheManager这个Bean做如下调整:
项目中原来使用了redis 作为sprin cache 的实现,当时的使用的spring-data-redis s是1.4.2 release 版本,实现使用的1.7.0 relsese 版本后,需要把cacheManager这个bean做
如下调整:
<bean id="cacheMangae" class="org.springframeworkdata.redis.cache.rediscacheManger"
c:templte-ref="redisTemplate"/>
<!--- 调整后-->
<bean id="cacheManager" class="org.springframeworkdata.redis.cache.rediscacheManger"
c:redisOperations-ref="redisTemplate">
</bean>
4.2 进行的spring session 配置
<!--
第1不得,在spring配置的文件中添加的如下的bean,
以后的在web.xml 中配置的session 超时时间的就无效了,如果的需要制定的
session 超时时间,则使用的:maxInactiveIntervalInSeconds
-->
这里怎么没有redis 连接配置,请看的redisHttpSessionConfiguration 的如下代码:
@bean
public redisTemplate<Object,object> sessionRedisTemplate(
RedisConnectionFactory connectionFactory){
redisTemplate<Object,Object> template=new RedisTemplate<Object,Object>;
template.seKeySerializer(new StringRedisserializeer());
template.setHashkeySerializer();
if(this.defaultRedisserviazlier!=null){
template.setConnectionFactory(connectionFactory);
return template;
}
}
项目中注入的jedisConnectionFactory bean 如下:
<bean id="jedisconnectionFactory" class="org.springframe.data.redis.connection.redis.conection"
P:host-name="${redis,hostname}"
p:port="${redis.port}"
p:database="${redis.database}"
p:poolConfig-ref="redispoolconfig"
p:use-pool="${redis.usepool}">
>
所以,如果你项目中从来没有的使用过的redis ,也可以使用如下配置:
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<!--
Jdeis连接工厂Bean
注意:这种方式没有使用连接池,生产环境下务必需要使用连接池
-->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="192.168.1.233" p:port="6379" p:database="15" p:usePool="false">
</bean>
下面的进行过滤器的配置:
<!-- 第2步:在web.xml中添加如下过滤器 注意:此过滤器必须放在其他过滤器之前-->
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5。方案对比
针对上述的3中的方案: 以下是个人见解:
方案1: 使用的tomcat 内置的session复制的方案, 优点 : 内置
simpleTcpCluster 缺点: 只是适合的tomcat 小集群,不适合的
大集群,因为session复制的是all to all 的方式。
方案2: 优点: 已经实现了对tomcat 的支持
使用的第三方基于的tomcat 的实现的session 管理的 缺点: 第三方的支持的,支持力度不够,
tomcat-session-manager
方案: 使用spring session 实现 优点:不依赖于特定容器,官方支持
基于redis 存储实现
建议使用的spring session 来实现的session 共享更加好用。
9.web项目如何优化:
一。压缩的浏览器段,分多个方面:
1.压缩源码和图片和图片
js 文件源代码的尅采用混淆的压缩的方式,CSS的方式的
进行普通压缩的JPG的方式可以根据的具体的质量的来研所的为50%,
到70%.PNG 可以采用的一些开源的压缩软件的来压缩,比如的去掉
一些PNG的格式的信息。
2.选择合适的图片的格式:
如果图片颜色的较多的就是用的JPG的格式,如果图片颜色较少的
就使用PNG格式,如果能够的通过服务器段来判断的浏览器支持的
webp,那么久使用webP和SVG 格式。
3。合并静态资源的
包括的CSS,js 和小图片减少的HTTP的请求。
4.开启的服务端的Gzip的压缩
5.使用cdn 的
或者的是公开哭的第三发过的低通的静态资源的比如Jquery,
normalize.css. 一方面的增加并发下载量,领一刚面
6。延长静态资源的缓存时间
这样的,频繁的访问的网站的访客的就能够的更快的访问。
不过的,这里的是通过的修改了文件的方式,确保的在资源的更新的
时候,用户会拉取到的最新的内容。
7.把CSS放在的页面的头部,把javasscrput 放在页面的
底部
https://blog.csdn.net/qq_39871740/article/details/79721149
https://blog.csdn.net/fuyifang/column/info/webxingneng