cookie用法与httponly


1.Cookie普通用法

//添加cookie
Cookie cookie = new Cookie("userid",user.getProviderId()); cookie.setPath("/"); response.addCookie(cookie);
//获取cookie        
Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("userid")) {
      String userid = cookie.getValue();
      。。。。 break; } } } }

增加 cookie 安全性添加HttpOnly和secure属性

  一、属性说明:

  1 secure属性

  当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。

  2 HttpOnly属性

  如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。

  对于以上两个属性,

  首先,secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly属性的目的是防止程序获取cookie后进行攻击。

  其次,GlassFish2.x支持的是servlet2.5,而servlet2.5不支持Session Cookie的"HttpOnly"属性。不过使用Filter做一定的处理可以简单的实现HttpOnly属性。GlashFish3.0(支持servlet3.0)默认开启Session Cookie的HttpOnly属性。

  也就是说两个属性,并不能解决cookie在本机出现的信息泄漏的问题(FireFox的插件FireBug能直接看到cookie的相关信息)。

二.具体应用:添加filter

public class CookieFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        Cookie[] cookies = req.getCookies();

        if (cookies != null) {
                Cookie cookie = cookies[0];
                if (cookie != null) {
                    /*cookie.setMaxAge(3600);
                    cookie.setSecure(true);
                    resp.addCookie(cookie);*/
                    
                    //Servlet 2.5不支持在Cookie上直接设置HttpOnly属性
                    String value = cookie.getValue();
                    StringBuilder builder = new StringBuilder();
                    builder.append("JSESSIONID=" + value + "; ");
                    builder.append("Secure; ");
                    builder.append("HttpOnly; ");
                    Calendar cal = Calendar.getInstance();
                    cal.add(Calendar.HOUR, 1);
                    Date date = cal.getTime();
                    Locale locale = Locale.CHINA;
                    SimpleDateFormat sdf = 
                            new SimpleDateFormat("dd-MM-yyyy HH:mm:ss",locale);
                    builder.append("Expires=" + sdf.format(date));
                    resp.setHeader("Set-Cookie", builder.toString());
                }
        }
        chain.doFilter(req, resp);
    }

    public void destroy() {
    }

    public void init(FilterConfig arg0) throws ServletException {
    }
}

web.xml

    <filter>
        <filter-name>cookieFilter</filter-name>
        <filter-class>com.sean.CookieFilter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>cookieFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM