我想安全标志添加到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入口点的工作。
这可以用一个定制的阀,提供了一个钩到所述创建请求对象来来达到的。 安全标志在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>
我想像其他容器让你做同样的事情为好。