在Java Web应用程序上的会话cookie的安全标志(Secure flag on sessio

2019-10-20 05:45发布

我想安全标志添加到Java Web应用程序会话cookie。 然而,标准的做法提出了一个问题,即当安全是真实的,即使HTTP请求将获得安全标志。 这意味着,在Web服务器上,无法subsiquent请求cookie的回暖,我们结束了一个新的会话。 它工作正常的HTTPS。 有问题的应用程序有多个入口点,从不同的领域和一些内部的入口点,以及与内部的IP。 有些是HTTPS,有些是HTTP。 我需要能够获得安全标志HTTPS请求进行设置,但是HTTP的。 这需要由域虽然完成,而不是通过协议,因为,所有的HTTPS请求经过一个负载均衡,做SSL卸载,所以由请求到达Web服务器(这是JBoss的7.1.1),它是HTTP,即使客户会看到它作为HTTPS,将需要在会话cookie的安全标志。 这里是我试过的配置:

    <session-config>
    <session-timeout>60</session-timeout>
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

我不得不设置安全为false但是,否则没有任何HTTP入口点的工作。

Answer 1:

这可以用一个定制的阀,提供了一个钩到所述创建请求对象来来达到的。 安全标志在cookie中自动设定(不web.xml中设置),如果servlet请求是安全的。 在请求中设置安全标志可以从阀来完成。

负载平衡器上的报头添加Front-End-Https其中阀检测和设置相应固定。

这里是阀门类:

import java.io.IOException;

import javax.servlet.ServletException;

import org.apache.catalina.Valve;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;

public class SecureRequestModifyingValve extends ValveBase
{
    private static final String LB_HTTPS_HEADER = "Front-End-Https";

    @Override
    public void invoke(final Request request, final Response response) throws IOException, ServletException
    {
        final String httpsHeader = request.getHeader(LB_HTTPS_HEADER);
        request.setSecure(httpsHeader != null && httpsHeader.equalsIgnoreCase("on"));
        getNext().invoke(request, response);
    }
}

我有JBoss的通过将以下的WAR内的jboss-web.xml中使用它。

<valve>
    <class-name>com.lifecycle.framework.valve.SecureRequestModifyingValve
    </class-name>
</valve>

我想像其他容器让你做同样的事情为好。



文章来源: Secure flag on session cookies in a Java Web Application