Cookie的安全属性
- HTTP协议不仅仅是无状态的,而且是不安全的!如果不希望Cookie在非安全协议中传输,可以设置Cookie的secure属性为true,浏览器只会在HTTPS和SSL等安全协议中传输该Cookie。
- 当然了,设置secure属性不会将Cookie的内容加密。如果想要保证安全,最好使用md5算法加密【后面有】。
Cookie的应用
显示用户上次访问的时间
- 其实就是每次登陆的时候,取到Cookie保存的值,再更新下Cookie的值。
- 访问Serlvet有两种情况
- 第一次访问
- 已经访问过了
- 全部代码如下:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); response.setContentType("text/html;charset=UTF-8"); PrintWriter printWriter = response.getWriter(); //获取网页上所有的Cookie Cookie[] cookies = request.getCookies(); //判断Cookie的值是否为空 String cookieValue = null; for (int i = 0; cookies != null && i < cookies.length; i++) { //获取到以time为名的Cookie if (cookies[i].getName().equals("time")) { printWriter.write("您上次登陆的时间是:"); cookieValue = cookies[i].getValue(); printWriter.write(cookieValue); cookies[i].setValue(simpleDateFormat.format(new Date())); response.addCookie(cookies[i]); //既然已经找到了就可以break循环了 break; } } //如果Cookie的值是空的,那么就是第一次访问 if (cookieValue == null) { //创建一个Cookie对象,日期为当前时间 Cookie cookie = new Cookie("time", simpleDateFormat.format(new Date())); //设置Cookie的生命期 cookie.setMaxAge(20000); //response对象回送Cookie给浏览器 response.addCookie(cookie); printWriter.write("您是第一次登陆啊!"); }
按照正常的逻辑来写,程序流程应该是这样子的。先创建Cookie对象,回送Cookie给浏览器。再遍历Cookie,更新Cookie的值。
- 但是,按照上面的逻辑是做不到的!因为每次访问Servlet的时候都会覆盖原来的Cookie,取到Cookie的值永远都是当前时间,而不是上次保存的时间。
- 我们换一个逻辑写:先检查(遍历)所有Cookie有没有我要的,如果得不到我想要的Cookie,Cookie的值是null,那么就是第一次登陆,于是就有了上面的代码了。
- 我们来看下效果吧!当我第一次登陆的时候
Cookie保存在硬盘中。
再次访问Servlet。明显地,取到的就是Cookie的值
显示上次浏览过商品
- 我就以书籍为例子了!首先设计Book对象
private String id ; private String name ; private String author; public Book() { } public Book(String id, String name, String author) { this.id = id; this.name = name; this.author = author; } ...各种set、get方法
设计一个简单的数据库存储数据。就用LinkedHashMap集合【根据商品的id找书籍所以用Map,删改较多所以用Linked】
private static LinkedHashMap<String, Book> linkedHashMap = new LinkedHashMap(); //简化开发复杂度,book的id和商品的id相同 static { linkedHashMap.put("1", new Book("1", "javaweb", "zhong")); linkedHashMap.put("2", new Book("2", "java", "fu")); linkedHashMap.put("3", new Book("3", "oracle", "cheng")); linkedHashMap.put("4", new Book("4", "mysql", "ou")); linkedHashMap.put("5", new Book("5", "ajax", "zi")); } //获取到所有书籍 public static LinkedHashMap getAll() { return linkedHashMap; }
显示网页上所有的书籍【首页】
printWriter.write("网页上所有的书籍:"+"<br/>"); //拿到数据库所有的书 LinkedHashMap<String, Book> linkedHashMap = DB.getAll(); Set<Map.Entry<String, Book>> entry = linkedHashMap.entrySet(); //显示所有的书到网页上 for (Map.Entry<String, Book> stringBookEntry : entry) { Book book = stringBookEntry.getValue(); printWriter.write(book.getId() +" "+ book.getName()+"<br/>"); }
- 接着,我们要做的就是给显示的书籍挂上一个超链接,当用户点击想看的书籍时,就跳转到该书籍的详细信息页面
- 超链接应该把书的id传递过去,不然处理页面是不知道用户想看的是哪一本书的!
//显示所有的书到网页上 for (Map.Entry<String, Book> stringBookEntry : entry) { Book book = stringBookEntry.getValue(); printWriter.write("<a href='/ouzicheng/Servlet2?id=" + book.getId() + "''target=_blank' +" + book.getName() + "</a>"); printWriter.write("<br/>"); }