Cookie API
为了封装cookie信息在Cookie API中提供了一个javax.servlet.httpCookie类,该类包含生成Cookie信息和提取cookie信息各个属性的方法。
如果一个存在浏览器缓存中的cookie的路径是/hhh/servlet/
当访问http://localhost:8080/hhh/CookiePathDemo1时,浏览器根本不带Cookie给服务器。
浏览器比对的是cookie的路径和当前访问的资源的路径。
浏览器满足一下条件就会带cookie给服务器:
当前访问的地址的路径.startWith(已存cookie的路径)。
即:如果一个Cookie的路径设置为了当前应用,说明访问该网站的任何资源时浏览器都带该cookie给服务器。(开发中经常做的)
把Cookie写给客户端:
HttpServletResponse.addCookie(Cookie c):实际上就是向客户端发送了一个响应消息头。
注意:客户端只能保存一个网站最多20个Cookie数据,总共最多300个。每个Cookie的大小
不能超过4kb。
注意:domain+path+name唯一确定一个Cookie。
构造方法
cookie类有且仅有一个构造方法
public Cookie(java.lang.String name, java.lang.String value);
name 指定cookie名称
value 指定cookie值
cookie类的常用方法
| 方法声明 | 功能描述 |
|---|---|
| void setPath(java.lang.String uri) | :设置cookie的有效访问路径 |
| void setMaxAge(int expiry) | : 设置cookie的有效时间 |
| void setValue(java.lang.String newValue) | :设置cookie的值 |
| void setDomain(String pattern) | :设置cookie的项的有效域 |
| void setVersion() | :设置cookie的项的有效域 |
| void setComment(String purpose) | :设置cookie的项的注解部分 |
| void setDomain(String pattern) | :设置cookie的项采用的协议版本 |
| String getName() | |
| String getValue | |
| int get maxAge() | |
| String getPath | |
| void response.addCookie(Cookie cookie) : 发送cookie | 发送cookie到浏览器端保存 |
| cookieCookie[] request.getCookies() : | 服务器接收cookie |
String username = request.getParameter("username");
String password = request.getParameter("password");
String remember = request.getParameter("remember");//没有选中就是null
Cookie c = new Cookie("loginInfo", username);
c.setPath(request.getContextPath());
if(remember==null){
//没有选中:删cookie
c.setMaxAge(0);
}else{
//用户记住用户名:存cookie
c.setMaxAge(Integer.MAX_VALUE);
}
response.addCookie(c);
out.write("登录成功");
}
//得到指定的cookie
String username = "";
String checked = "";
Cookie cs[] = request.getCookies();
for(int i=0;cs!=null&&i<cs.length;i++){
if("loginInfo".equals(cs[i].getName())){
username = cs[i].getValue();
checked="checked='checked'";
break;
}
}
cookie案例
public class Book {
private String id;
private String name;
private String price;
private String author;
private String description;
setter 和getter方法,无参构造,全参构造 此处省略
-------------------------- ------------- ------------------
//模拟数据
public class BookDB {
private static Map<String,Book> books = new HashMap<String,Book>();
static{
books.put("1", new Book("1", "《呼啸山庄》", "10", "艾米莉·勃朗特", "与世隔绝的“呼啸山庄”"));
books.put("2", new Book("2", "《雾都孤儿》", "20", "查尔斯·狄更斯", "勇敢地直面人生"));
books.put("3", new Book("3", "《简·爱》", "20", "夏洛蒂·勃朗特", "爱情经典"));
books.put("4", new Book("4", "《名利场》", "10", "萨克雷", "凡是有思想的人在"));
books.put("5", new Book("5", "《理智与情感》", "10", "简·奥斯汀", "经典著作"));
}
public static Map<String,Book> findAllBooks(){
return books;
}
public static Book findById(String bookId){
return books.get(bookId);
}
}
-----------------------------------------------------------------------
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
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 ShowAllBooksServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//显示所有的商品,提供查看详细内容的链接
out.write("<h1>书</h1>");
Map<String, Book> books = BookDB.findAllBooks();
for(Map.Entry<String, Book> b:books.entrySet()){
out.write(b.getValue().getName()+" <a href='"+request.getContextPath()+"/ShowDetailsServlet?id="+b.getKey()+"' target='_blank'>浏览</a><br/>");
}
out.write("<hr/>您最近的浏览记录如下:<br/>");
Cookie cs[] = request.getCookies();
for(int i=0;cs!=null&&i<cs.length;i++){
if("bookHistory".equals(cs[i].getName())){
String value = cs[i].getValue();
String ids[] = value.split("\\-");
for(String id:ids){
out.write(BookDB.findById(id).getName()+"<br/>");
}
break;
}
}
}
----------------------------------------------------------------------
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String id = request.getParameter("id");
Book book = BookDB.findById(id);
out.write(book.toString());
//组织数据,向客户端写cookie 3条
String bookId = makeId(id,request);
Cookie c = new Cookie("bookHistory", bookId);
c.setPath(request.getContextPath());
response.addCookie(c);
}
//组织数据
//客户端的cookie 当前访问的书的id
//cookie为null 1
//cookie不为null,但没有bookHistory 1
//bookHistory=1 2
private String makeId(String id, HttpServletRequest request) {
// cookie为null 1 bookHistory=1
Cookie cs[] = request.getCookies();
if(cs==null){
return id;
}
// cookie不为null,但没有bookHistory 1 bookHistory=1
Cookie bookHistoryCookie = null;
for(Cookie c:cs){
if("bookHistory".equals(c.getName())){
bookHistoryCookie = c;
break;
}
}
if(bookHistoryCookie==null){
return id;
}
String value = bookHistoryCookie.getValue();
String ids[] = value.split("\\-");
LinkedList<String> list = new LinkedList<String>(Arrays.asList(ids));
if(list.size()<3){
if(list.contains(id)){
list.remove(id);
}
}else{
if(list.contains(id)){
list.remove(id);
}else{
list.removeLast();
}
}
list.addFirst(id);
StringBuffer sb = new StringBuffer();
for(int i=0;i<list.size();i++){
if(i>0){
sb.append("-");
}
sb.append(list.get(i));
}
return sb.toString();
}
session对象
getSession()方法有两种重载形式
public HttpSession getSession();
public HttpSession getSession(Boolean create);
HttpSession 常用方法
HttpSession是一个域对象
void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name);
String getId()
HttpSession request.getSession();
HttpSession request.getSession(boolean b):
b如果为true,和getSession()完全一样的
b为false,服务器只是查找,找不到不会创建新的,返回null。
HttpSession.invalidate();使HttpSession对象立即失效。
放入购物车
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String id = request.getParameter("id");
Book b = BookDB.findById(id);
//放到HttpSession中用List来存
HttpSession session = request.getSession();
List<Book> cart = (List<Book>) session.getAttribute("commodity");
if(cart==null){
cart = new ArrayList<Book>();
session.setAttribute("commodity", cart);
}
commodity.add(b);
String url = request.getContextPath()+"/servlet/ShowAllBooksServlet";
url = response.encodeURL(url);
out.write(b.getName()+"已放入您的购物车<a href='"+url+"'>继续购物</a>");
-------------------------------------------------------------------------------
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
List<Book> cart = (List<Book>)session.getAttribute("commodity");
if(cart==null||cart.size()==0){
out.write("您还没有购买任何商品");
return;
}
out.write("<h1>你购买的商品如下</h1>");
for(Book b:cart){
out.write(b.getName()+"<br/>");
}
}
httpsession防止表单重复提交
String token = new BigInteger(165, new Random()).toString(36).toUpperCase();//GUID
request.getSession().setAttribute("token", token);
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
------------------------------------------------------------------------
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String stoken = (String) request.getSession().getAttribute("token");
String ftoken = request.getParameter("token");
if(ftoken.equals(stoken)){
System.out.println(name);
request.getSession().removeAttribute("token");
}else{
out.write("请不要重复提交");
}











网友评论