wwys 2019-05-26 11:38 采纳率: 20%
浏览 558

httpd反向代理tomcat时无法实现session会话的而保持

httpd配置如下

 Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
        <proxy balancer://tomcat>            
                BalancerMember http://192.168.131.130:8080 loadfactor=1 route=server1
                BalancerMember http://192.168.131.138:8080 loadfactor=1 route=server2
        </proxy>
        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
        ProxyPass / balancer://tomcat/ stickysession=ROUTEID
        ProxyPassReverse / balancer://tomcat/ stickysession=ROUTEID

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-09 20:39
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要解决这个问题,你需要确保在Apache HTTPD中启用stickysession功能,并且在Tomcat中也正确设置了Session。以下是一些可能的原因和解决方案:

    原因

    1. HTTPD未设置sticky session:如果你没有在HTTPD中启用sticky session(stickysession),那么它将不会对每个请求进行会话跟踪。
    2. Tomcat配置错误:检查Tomcat服务器的context.xml文件或类似的配置文件以确保设置了正确的session相关的属性。

    解决方案

    1. 在HTTPD中启用sticky session

    在你的httpd.conf或者httpd-vhosts.conf文件中添加<VirtualHost *:80>标签来创建一个新的虚拟主机。然后,在其中添加以下内容:

    <IfModule mod_proxy.c>
        <Directory /path/to/your/tomcat/server>
            ProxyPreserveHost On
            ProxyPass / http://localhost:8080/
            ProxyPassReverse / http://localhost:8080/
            AllowOverride All
        </Directory>
    </IfModule>
    

    在这个例子中,你可能需要替换 /path/to/your/tomcat/server 为你实际运行Tomcat的实际路径。

    2. 设置sticky session在Tomcat中

    • 在Tomcat的web.xml文件中找到<servlet-mapping>元素,例如:
    <servlet-mapping>
        <servlet-name>/</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    • 添加以下注释到这个元素:
    <servlet-name>/</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <mapping>
        <url-pattern>/</url-pattern>
    </mapping>
    
    • 然后在同一个文件中找到<init-param>元素, 例如:
    <init-param>
        <param-name>session.timeout</param-name>
        <param-value>300</param-value>
    </init-param>
    
    • 最后,在context.xml文件中设置session.timeout为300秒:
    <Context docBase="/path/to/your/webapp" reloadable="true">
        <!-- ... -->
        <Resource name="catalina" id="catalina" type="catalina.core.ContainerFactory"
                  class="com.sun.enterprise.v5.server.tomcat.Catalina">
            <!-- ... -->
            <Connector port="8080" protocol="HTTP/1.1"
                        connectionTimeout="20000" redirectPort="8443"/>
            <!-- ... -->
            <VMIdentity vmName="tomcat" vmVersion="10.0.7"/>
            <Valve className="org.apache.catalina.valves.ErrorReportValve" />
            <!-- ... -->
        </Resource>
    </Context>
    

    注意:这些步骤中的参数值应根据实际情况调整。对于特定的应用程序,可能还需要进一步调整其他配置项,以满足特定需求。

    3. 测试和验证

    完成后,请确保所有请求都成功地使用了新的sticky session。这可以通过在Tomcat端口8080上发送一个GET请求并查看响应头中的RouteID字段来进行验证。

    希望这些建议能帮助你解决问题!

    评论

报告相同问题?