1.测试代码
创建两个Severlet使用cookie就行存储数据
MyServlet1:
public class MyServlet1 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应编码格式 resp.setContentType("text/html;charset=utf-8"); //获取请求信息 String a=req.getParameter("a"); String b=req.getParameter("b"); //处理请求信息 System.out.println(a+":"+b); //响应处理结果 //创建Cookie数据 Cookie c=new Cookie("b", b); //响应Cookie数据 resp.addCookie(c); //直接响应 resp.getWriter().write("我是MyServlet1,处理完毕"); //请求转发 //重定向 } }
MyServlet2:
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet2 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应编码格式 resp.setContentType("text/html;charset=utf-8"); //获取请求信息 //String b=req.getParameter("b"); String bc=null; //获取Cookie数据 Cookie[] cookies = req.getCookies(); for(Cookie ck:cookies){ if("b".equals(ck.getName())){ bc=ck.getValue(); } } String c=req.getParameter("c"); //处理请求信息 System.out.println(bc+":"+c); //响应处理结果 //直接响应 resp.getWriter().write("我是MyServlet2,处理完毕"); //请求转发 //重定向 } }
2.可以看出b是共享数据,我们用先测试1
相应头中接收到数据
之后对MySeverlet2进行只对c数据赋值
3.控制台得到数据
cookie安全性问题
什么是cookie
指某些网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。(注:此定义来自百度百科)
cookie对于登录的效果
排除用户手动删除浏览器cookie以及cookie未过期的情况下,用户如果在某网站登录过一次,下次访问这个网站,用户不需要输入用户名和密码就可以进入网站。
cookie的生命周期
创建cookie的时候,会给cookie指定一个值:Expire,它就是指定cookie的有效期,也就是cookie的生命周期,超出设置的这个生命周期,cookie就会被清除。如果给这个值Expire设置为0或者负值,那么这样的设置就是在关闭浏览器时,就会清除cookie,这种方式更加安全。
为什么cookie不安全
最大的原因是因为它存储在浏览器端(用户本地),一些别有用心的人能够通过浏览器截获cookie(脚本、利用工具抓取等)。
cookie不安全的表现形式
cookie欺骗
但这时就会去考虑了,既然如此,为何不加密呢?加密后就算拿到cookie不是也没有用么?关键问题就在这里了,一些别有用心的人不需要知道这个cookie的具体含义,只需要将这个cookie向服务器提交(模拟身份验证),身份验证通过之后,就可以冒充被窃取cookie对应用户来访问网站,甚至获取到用户的隐私信息,对于用户的隐私造成非常严重的危害,这种方式就叫做cookie欺骗。
cookie截获
cookie以纯文本的形式在浏览器和服务器之间传递,在web通信时极容易被非法用户截获和利用。非法用户截获cookie后,在cookie的有效时间内重新发放给服务器,那么这个非法用户就拥有了这个合法用户的所有权限。
Flash的内部代码隐患
Flash中有一个getURL()函数,Flash利用它自动打开指定的页面。那么这个就意味着,你在观看Flash动画时,在Flash的内部可以悄无声息的打开一个极小的不易发现的包含特殊操作的页面,可以是木马,可以向远端输入当前cookie或者用户信息,这是非常危险的,由于这个是Flash内部的操作,所以网站无法禁止,要想避免,尽量打开本地防火墙以及访问正规网站。
如何解决cookie安全性问题
第一步:设置cookie有效期不要过长,合适即可
第二步:设置HttpOnly属性为true
可以防止js脚本读取cookie信息,有效的防止XSS攻击。
第三步:设置复杂的cookie,加密cookie
(1)cookie的key使用uuid,随机生成; (2)cookie的value可以使用复杂组合,比如:用户名+当前时间+cookie有效时间+随机数。 这样可以尽可能使得加密后的cookie更难解密,也是保护了cookie中的信息。
第四步:用户第一次登录时,保存ip+cookie加密后的token
每次请求,都去将当前cookie和ip组合起来加密后的token与保存的token作对比,只有完全对应才能验证成功。
第五步:session和cookie同时使用
sessionId虽然放在cookie中,但是相对的session更安全,可以将相对重要的信息存入session。
第六步:如果网站支持https,尽可能使用https
如果网站支持https,那么可以为cookie设置Secure属性为true,它的意思是,cookie只能使用https协议发送给服务器,而https比http更加安全。