JAVA设置HttpOnly Cookies
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相关推荐
- java中的hwid验证,JAVA设置HttpOnly Cookies
HttpOnly Cookies是一个cookie安全行的解决方案. 在支持HttpOnly cookies的浏览器中(IE6+,FF3.0+),如果在Cookie中设置了"HttpOnly ...
- java设置httponly_JAVA设置HttpOnly Cookies
HttpOnly Cookies是一个cookie安全行的解决方案. 在支持HttpOnly cookies的浏览器中(IE6+,FF3.0+),如果在Cookie中设置了"HttpOnly ...
- java设置httponly,java设置httponly
()+3600*24,"","",0); setcookie("TestCookie","abcdef",time()+ ...
- Java 设置 httponly cookie
Httponly cookie 是一种 cookie 安全解决方案. 在支持httponly cookie的浏览器(IE6+.FF3.0+)中,如果cookie中设置了"httponly&q ...
- java httponly设置_cookie 设置 httpOnly属性
cookie 设置 httpOnly属性防止js读取cookie. 建立filter拦截器类 CookieHttpOnlyFilterimport java.io.IOException; impor ...
- java设置httponly_Tomcat为Cookie设置HttpOnly属性
B:服务端可以自定义建立Cookie对象及属性传递到客户端: 服务端建立的Cookie如果没有设置HttpOnly属性,则在客户端可以用js读取Cookie中的内容(客户端脚本可以读取Session ...
- cookie 设置 httpOnly属性
cookie 设置 httpOnly属性防止js读取cookie. 建立filter拦截器类 CookieHttpOnlyFilter import java.io.IOException; impo ...
- Cookie的secure和httpOnly属性的含义 以及 Cookie设置HttpOnly,Secure,Expire属性
Cookie的secure和httpOnly属性的含义 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...
- cookie设置HttpOnly
1.什么是HttpOnly? 如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安 ...
最新文章
- python笔记:数组的一些操作
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法...
- Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份
- linux导入通达oa数据库,将通达OA迁移到linux平台
- 计算机图形学完整笔记(五):二维图形变换
- android Tbs腾讯X5内核初始化失败
- 菜鸟记录:安卓手机导出微信聊天记录
- 线性共轭梯度法python_python实现共轭梯度法
- 情人节程序员用HTML网页表白【表白对话】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- STOP:0x0000007E蓝屏软件故障处理
- icpc西部区域赛_江西软件大学夺得第八届高校联赛西部大区总冠军
- Mac设置命令行代理
- 请求转发和重定向的区别以及什么时候使用
- leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排
- Unity Instantiate函数用于复制对象
- 动网8.3 整合 个人网站
- JAVA字节码增强技术之ASM
- EasyDial 录音系统
- Menu控件(Android设置选项菜单和快捷菜单)
- 恐怖庄园的秘密 The Secret of Grisly Manor攻略