cookie Secure httpOnly等属性

会话cookie和持久cookie区别

      如果不设置过期时间,则表示这个cookie声明周期为浏览器会话期间,只要关闭浏览器,cookie就会消失,这种声明周期为浏览器期间的为会话cookie,会话cookie一般保存在内存中。if设置了期限,浏览器会把cookie保存到硬盘中,关闭之后再次打开浏览器,这些cookie依旧有效,知道超过设定期限,存储在硬盘上的cookie可以在不同浏览器进程之间共享,eg:两个IE窗口。而对于保存在内存中的cookie,不同浏览器有不同处理方式。

以下转发https://blog.csdn.net/weixin_34356138/article/details/89654083

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

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

 
  1. setName(String name)

  2. 修改Session ID的名称,默认为"JSESSIONID"

  3. setDomain(String domain)

  4. 设置当前Cookie所处于的域

  5. setPath(String path)

  6. 设置当前Cookie所处于的相对路径

  7. setHttpOnly(boolean httpOnly)

  8. 设置是否支持HttpOnly属性

  9. setSecure(boolean secure)

  10. 若使用HTTPS安全连接,则需要设置其属性为true

  11. setMaxAge(int maxAge)

  12. 设置存活时间,单位为秒

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

 
  1. 全局设置Session-Cookie相交互部分属性

  2. @WebListener

  3. public class SessionCookieInitialization implements ServletContextListener {

  4. private static final Log log = LogFactory

  5. .getLog(SessionCookieInitialization.class);

  6.  
  7. public void contextInitialized(ServletContextEvent sce) {

  8. log.info("now init the Session Cookie");

  9.  
  10. ServletContext servletContext = sce.getServletContext();

  11.  
  12. SessionCookieConfig sessionCookie = servletContext

  13. .getSessionCookieConfig();

  14. sessionCookie.setName("YONGBOYID");

  15. sessionCookie.setPath(servletContext.getContextPath());

  16. sessionCookie.setHttpOnly(true);

  17. sessionCookie.setSecure(false);

  18.  
  19. log.info("name : " + sessionCookie.getName() + "\n" + "domain:"

  20. + sessionCookie.getDomain() + "\npath:"

  21. + sessionCookie.getPath() + "\nage:"

  22. + sessionCookie.getMaxAge());

  23.  
  24. log.info("isHttpOnly : " + sessionCookie.isHttpOnly());

  25. log.info("isSecure : " + sessionCookie.isSecure());

  26. }

  27.  
  28. public void contextDestroyed(ServletContextEvent sce) {

  29. log.info("the context is destroyed !");

  30. }

  31. }

需要通过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文件中配置即可:

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

  2. ...

  3. </Context>

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

 
  1. <div style="margin: 40px; paddding: 10px">

  2. <div><a href="sessionCookieTest">正常连接</a></div>

  3. <div><a href="<%=response.encodeURL("sessionCookieTest") %>">重定向连接</a></div>

  4. </div>

  5.  

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值