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