# Tomcat下如何利用过滤器来完成对cookie添加httponly或secure标识

- Link: https://www.xuepaijie.com/html/skill/devops/711.html
- Published: 2016-11-15T16:55:35+08:00
- Author: Admin

httponly和secure两个标识是现代化浏览器对cookie安全保护的一大举措，我们来简单看下
其作用。httponly是为了防护xss对cookie的劫持，在通用的攻击场景中，通过植入xss来劫持
到管理者或用户的cookie，然后绕过应用的账户管控措施进入到操作页面完成非法的操作。
secure是为了解决https与http间的问题，http是一种透明的传输，也就是说能看到明文，而
https是具有加密的，secure的设置正是声明仅跟随https的请求，不答理http。

Tomcat下有一种好的通用解决措施就是过滤器来操作，举例如下，具体的业务情况请自行调整。

    ```html;
    private void rewriteCookieToHeader(HttpServletRequest request, HttpServletResponse response) {
        if (response.containsHeader("SET-COOKIE")) {
            String sessionid = request.getSession().getId();
            String contextPath = request.getContextPath();
            String secure = "";
            if (request.isSecure()) {
                secure = "; Secure"; 
            }
            response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid
                             + "; Path=" + contextPath + "; HttpOnly" + secure);
        }
    }
    ```

我们需要明白的是，使用request.isSecure()并不总是准确的，考虑到负载均衡技术为执行
SSL加速，请求从浏览器到负载均衡器过来是HTTPS，而负载均衡器和实际服务器之间的请求
可能会通过普通HTTP。这将导致request.isSecure()是假的，而浏览器确实使用SSL。
