HttpOnly Cookies是一个cookie安全行的解决方案。

在支持HttpOnly cookies的浏览器中(IE6+,FF3.0+),如果在Cookie中设置了"HttpOnly"属性,那么通过JavaScript脚本将无法读取到Cookie信息,这样能有效的防止XSS攻击,让网站应用更加安全。

但是J2EE4,J2EE5 的Cookie并没有提供设置 HttpOnly 属性的方法,所以如果需要设置HttpOnly属性需要自己来处理。


import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;/*** Cookie工具类*/
public class CookieUtil {/*** 设置HttpOnly Cookie* @param response HTTP响应* @param cookie Cookie对象* @param isHTTPOnly 是否为HttpOnly*/public static void addCookie(HttpServletResponse response, Cookie cookie, boolean isHttpOnly) {String name = cookie.getName();//Cookie名称String value = cookie.getValue();//Cookie值int maxAge = cookie.getMaxAge();//最大生存时间(毫秒,0代表删除,-1代表与浏览器会话一致)String path = cookie.getPath();//路径String domain = cookie.getDomain();//域boolean isSecure = cookie.getSecure();//是否为安全协议信息 StringBuilder buffer = new StringBuilder();buffer.append(name).append("=").append(value).append(";");if (maxAge == 0) {buffer.append("Expires=Thu Jan 01 08:00:00 CST 1970;");} else if (maxAge > 0) {buffer.append("Max-Age=").append(maxAge).append(";");}if (domain != null) {buffer.append("domain=").append(domain).append(";");}if (path != null) {buffer.append("path=").append(path).append(";");}if (isSecure) {buffer.append("secure;");}if (isHttpOnly) {buffer.append("HTTPOnly;");}response.addHeader("Set-Cookie", buffer.toString());}}

值得一提的是,Java EE 6.0 中 Cookie已经可以设置HttpOnly了,所以如果是兼容 Java EE 6.0 的容器(例如如 Tomcat 7),可以直接使用Cookie.setHttpOnly 的方法来设置HttpOnly:

cookie.setHttpOnly(true);

在Servlet 3.0中增加对Cookie(请注意,这里所说的Cookie,仅指和Session互动的Cookie,即人们常说的会话Cookie)较为全面的操作API。最为突出特性:支持直接修改Session ID的名称(默认为“JSESSIONID”),支持对cookie设置HttpOnly属性以增强安全,避免一定程度的跨站攻击。防止脚本攻击,禁止了通过脚本获取cookie信息,浏览器不会将其发送给任何第三方

利用拦截器实现,判断每次请求的响应是否包含SET-COOKIE头部,重写会话Cookie,添加需要的属性。虽较为生硬,但灵活性强。
新的规范API
新的规范添加SessionCookieConfig接口,用于操作会话Cookie,需要掌握以下主要方法:

setName(String name)
修改Session ID的名称,默认为"JSESSIONID"
setDomain(String domain)
设置当前Cookie所处于的域
setPath(String path)
设置当前Cookie所处于的相对路径
setHttpOnly(boolean httpOnly)
设置是否支持HttpOnly属性
setSecure(boolean secure)
若使用HTTPS安全连接,则需要设置其属性为true
setMaxAge(int maxAge)
设置存活时间,单位为秒

如何使用呢,很方便,在ServletContextListener监听器初始化方法中进行设定即可;下面实例演示如何修改"JSESSIONID",以及添加支持HttpOnly支持:

全局设置Session-Cookie相交互部分属性
@WebListener
public class SessionCookieInitialization implements ServletContextListener {
private static final Log log = LogFactory.getLog(SessionCookieInitialization.class);public void contextInitialized(ServletContextEvent sce) {log.info("now init the Session Cookie");ServletContext servletContext = sce.getServletContext();SessionCookieConfig sessionCookie = servletContext.getSessionCookieConfig();sessionCookie.setName("YONGBOYID");sessionCookie.setPath(servletContext.getContextPath());sessionCookie.setHttpOnly(true);sessionCookie.setSecure(false);log.info("name : " + sessionCookie.getName() + "\n" + "domain:"+ sessionCookie.getDomain() + "\npath:"+ sessionCookie.getPath() + "\nage:"+ sessionCookie.getMaxAge());log.info("isHttpOnly : " + sessionCookie.isHttpOnly());log.info("isSecure : " + sessionCookie.isSecure());
}public void contextDestroyed(ServletContextEvent sce) {log.info("the context is destroyed !");
}
}

需要通过ServletContext对象获得SessionCookieConfig对象,才能够进一步自定义session cookie的属性。
无论以前的硬编码还是新的API实现,目标都是一致的,所产生头部信息也是完全一致。
毫无疑问,后者更为方便快捷,省缺了显示的操作响应元数据。
对当前站点的第一次请求,很容易从响应头信息中看到Set-Cookie的属性值:

不同浏览器平台上测试
在Safari、IE8、Opera 11 一切都很正常
Firefox 3.6、Chrome 9.0,JSESSIONID会继续存在:

    YONGBOYID=601A6C82D535343163B175A4FD5376EA; JSESSIONID=AA78738AB1EAD1F9C649F705EC64D92D; AJSTAT_ok_times=6; JSESSIONID=abcpxyJmIpBVz6WHVo_1s; BAYEUX_BROWSER=439-1vyje1gmqt8y8giva7pqsu1

在所有浏览器中,SESSION ID等于新设置的YONGBOYID值(若不相等,问题就严重了!)
在客户端JS无法获得正确的SESSIONI ID了。

Tomcat服务器内置支持
可以不用如上显示设置Cookie domain、name、HttpOnly支持,在conf/context.xml文件中配置即可:

<Context useHttpOnly="true", sessionCookieName="YONGBOYID", sessionCookieDomain="/servlet3" … >
...
</Context>

既然JAVA应用服务器本身支持会话Cookie设定,那就没有必要在程序代码中再次进行编码了。这是一个好的实践:不要重复造轮子。
这里给出一段测试Session重写的一段脚本:

<div style="margin: 40px; paddding: 10px">
<div><a href="sessionCookieTest">正常连接</a></div>
<div><a href="<%=response.encodeURL("sessionCookieTest") %>">重定向连接</a></div>
</div>

会被重写的URL地址类似于:

http://localhost/servlet3/sessionCookieTest;YONGBOYID=19B94935D50245270060E49C9E69F5B6

嗯,在取消会话Cookie之后,可以直接看到修改后的SESSION ID名称了,当然这时候HttpOnly属性也没有多大意义了。
有一点别忘记,设置HttpOnly之后,客户端的JS将无法获取的到会话ID了

JAVA设置HttpOnly Cookies相关推荐

  1. java中的hwid验证,JAVA设置HttpOnly Cookies

    HttpOnly Cookies是一个cookie安全行的解决方案. 在支持HttpOnly cookies的浏览器中(IE6+,FF3.0+),如果在Cookie中设置了"HttpOnly ...

  2. java设置httponly_JAVA设置HttpOnly Cookies

    HttpOnly Cookies是一个cookie安全行的解决方案. 在支持HttpOnly cookies的浏览器中(IE6+,FF3.0+),如果在Cookie中设置了"HttpOnly ...

  3. java设置httponly,java设置httponly

    ()+3600*24,"","",0); setcookie("TestCookie","abcdef",time()+ ...

  4. Java 设置 httponly cookie

    Httponly cookie 是一种 cookie 安全解决方案. 在支持httponly cookie的浏览器(IE6+.FF3.0+)中,如果cookie中设置了"httponly&q ...

  5. java httponly设置_cookie 设置 httpOnly属性

    cookie 设置 httpOnly属性防止js读取cookie. 建立filter拦截器类 CookieHttpOnlyFilterimport java.io.IOException; impor ...

  6. java设置httponly_Tomcat为Cookie设置HttpOnly属性

    B:服务端可以自定义建立Cookie对象及属性传递到客户端: 服务端建立的Cookie如果没有设置HttpOnly属性,则在客户端可以用js读取Cookie中的内容(客户端脚本可以读取Session ...

  7. cookie 设置 httpOnly属性

    cookie 设置 httpOnly属性防止js读取cookie. 建立filter拦截器类 CookieHttpOnlyFilter import java.io.IOException; impo ...

  8. Cookie的secure和httpOnly属性的含义 以及 Cookie设置HttpOnly,Secure,Expire属性

    Cookie的secure和httpOnly属性的含义 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...

  9. cookie设置HttpOnly

    1.什么是HttpOnly? 如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安 ...

最新文章

  1. python笔记:数组的一些操作
  2. 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法...
  3. Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份
  4. linux导入通达oa数据库,将通达OA迁移到linux平台
  5. 计算机图形学完整笔记(五):二维图形变换
  6. android Tbs腾讯X5内核初始化失败
  7. 菜鸟记录:安卓手机导出微信聊天记录
  8. 线性共轭梯度法python_python实现共轭梯度法
  9. 情人节程序员用HTML网页表白【表白对话】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  10. STOP:0x0000007E蓝屏软件故障处理
  11. icpc西部区域赛_江西软件大学夺得第八届高校联赛西部大区总冠军
  12. Mac设置命令行代理
  13. 请求转发和重定向的区别以及什么时候使用
  14. leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排
  15. Unity Instantiate函数用于复制对象
  16. 动网8.3 整合 个人网站
  17. JAVA字节码增强技术之ASM
  18. EasyDial 录音系统
  19. Menu控件(Android设置选项菜单和快捷菜单)
  20. 恐怖庄园的秘密 The Secret of Grisly Manor攻略

热门文章

  1. 软考电子商务设计师备考资料
  2. admin后台管理及数据库表管理
  3. MySQL InnoDB MVCC机制吐血总结
  4. 分子动力学论文--算法和参数设置1
  5. Java基于SSM的企业OA办公系统
  6. 服务器虚拟机存储池安全,最佳实践:建设统一CEPH存储池
  7. js获取当前年月日yyyymmdd格式的代码
  8. 你就是孩子最好的玩具——情感引导式教育
  9. Android 开发 系统组件集合
  10. java 取名字_Java 中获取类名的三种方法,你知道几种?