cookie 技术:
cookie属性:
name: 名称
value:取值
path:路径(可选)
maxAge :生命周期,默认是一次回话
version:可选版本号
domain:域名(可选)
comment:备注(可选)
获取浏览器最后的访问时间:
代码:
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw=response.getWriter();
pw.write("您最后一次访问的时间为:<br/>");
//获取浏览器全部cookie
Cookie []cookie=request.getCookies();
//遍历
for(int i=0;cookie!=null&&i<cookie.length;i++){
Cookie cook=cookie[i];
if("lastAccessTime".equals(cook.getName())){
//从浏览器上获取到的为字符串
String value=cook.getValue();
//将字符串解析为十进制
Long time=Long.parseLong(value);
//将毫秒值转化为日期
Date d=new Date(time);
//显示为设定格式的日期
DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str=df.format(d);
pw.write(str);
break;
}
}
//将第一次浏览的时间写入cookie,显示在浏览器上的必须是字符串
Cookie c=new Cookie("lastAccessTime", System.currentTimeMillis()+"");
response.addCookie(c);
关闭浏览器意味着一次回话结束,重新打开浏览器,第一次访问不会显示时间,第二次访问才会有时间。
清除cookie:
<a href='"+request.getContextPath()+"/servlet/TextCookie2'>清空</a>
TextCookie2的代码:
Cookie c=new Cookie("lastAccessTike", "");
c.setMaxAge(0);
response.addCookie(c);
服务器的去访问浏览器的cookie时,当服务器提供的路径不是以浏览器存放的cookie的路径开头时,
伪代码形式:服务器提供的路径.startWith(浏览器存放的cookie的路径)为false时,
则无法访问原来存放于浏览器的cookie。
c.setPath(request.getContextPath());//本应用都可以访问到该cookie
登录页面:
记住用户名功能:
表单页面:
//登录表单
String value="";
String checked="";
//获取包含所有的cookie的cookie数组
Cookie []c=request.getCookies();
for(int i=0;c!=null&&i<c.length;i++){
Cookie cook=c[i];
if("usernameinof".equals(cook.getName())){
value=cook.getValue();
checked="checked='checked'";
break;
}
}
response.setContentType("text/html;charset=UTF-8");
PrintWriter out =response.getWriter();
out.write("<form action='"+request.getContextPath()+"/servlet/TextCookie4' method='post'><br/>");
out.write("登录用户名:<input type='text' name='username' value='"+value+"'/><br/>");
out.write("密码:<input type='password' name='psw'/><br/>");
out.write("记住用户名:<input type='checkbox' name='remember' "+checked+"/> <br/>");
out.write("<input type='submit' value='登录'/><br/>");
out.write("</form>");
cookie页面代码:
response.setContentType("text/html;charset=UTF-8");
PrintWriter out =response.getWriter();
//获取表单中的用户名密码和checkbox
String username=request.getParameter("username");
String password=request.getParameter("psw");
String remember=request.getParameter("remember");
//判断帐号和密码是否正确,这里用简单的反转判断
password=new StringBuffer(password).reverse().toString();
if(!username.equals(password)){
out.write("请输入正确的帐号和密码,2秒后跳转到登录页面");
//跳转到登录页面
response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/servlet/TextCookie3");
return;
}
//将获取到的数据保存到cookie中
Cookie c=new Cookie("usernameinof", username);
c.setPath(request.getContextPath());
if(remember!=null){
c.setMaxAge(Integer.MAX_VALUE);
}else{
c.setMaxAge(0);
}
response.addCookie(c);
out.write("恭喜你,登录成功!");
记录浏览过的商品:
商品类Book描述:普通的描述
模拟数据库:
public class Bookdb {
private static Map<String,Book> books=new HashMap<String, Book>();
static{
books.put("1", new Book("1", "玉女心经", "hehe"));
books.put("2", new Book("2", "辟邪剑谱", "haha"));
books.put("3", new Book("3", "葵花宝典", "xixi"));
}
//获取所有书籍的方法
public static Map<String, Book> findAllBooks(){
return books;
}
public static Book findBookbyid(String bookid){
return books.get(bookid);
}
}
主显示页:
public class ShowAllBooks 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> m=Bookdb.findAllBooks();
Set<Map.Entry<String, Book>> s =m.entrySet();
//显示所有
for(Map.Entry<String, Book> me:s){
out.write(me.getValue().getName()+"<a href='"+request.getContextPath()+"/servlet/ShowBookDetal?bookid="+me.getKey()+"' target='_blank'>查看</a>"+"<br/>");
}
//将浏览过的显示出来
out.write("您浏览过的书籍"+"<br/>");
Cookie []cs=request.getCookies();
for(int i=0;cs!=null&&i<cs.length;i++){
Cookie c = cs[i];
if("book".equals(c.getName())){
String value = c.getValue();
String ids[] =value.split("\\-");
for(String id:ids){
out.write(Bookdb.findBookbyid(id).getName()+"<br/>");
}
break;
}
}
}
书详细描述显示页:
public class ShowBookDetal extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/* 当前id 写入
* 1 无cookie, 1 1
* 2有cookie,但无book, 1 1
* 3cookie为1 2 2-1
* 4cookie为2-1 1 1-2
* 5cookie为2-1 3 3-2-1
* 6cookie为3-2-1 2 2-3-1
* 7cookie为3-2-1 4 4-3-2
*/
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//2显示商品的详细信息;
out.write("详细内容:<br/>");
String bookid = request.getParameter("bookid");
Book book = Bookdb.findBookbyid(bookid);
out.write(book.toString());
//3写cookie:记住浏览历史记录
String bookids = makeids(request,bookid);
Cookie c = new Cookie("book", bookids);
c.setMaxAge(Integer.MAX_VALUE);
c.setPath(request.getContextPath());
response.addCookie(c);
}
//组织写到cookie中的书籍的id。多个id之间用-分割。最多存3个
/*
客户端带过来的ID 当前看的书的ID 应该写回的ID
1、一个cookie都木有 1 bookHistory=1
2、有cookie,但没有bookHistory 1 bookHistory=1
3、bookHistory=1 2 bookHistory=2-1
4、bookHistory=2-1 1 bookHistory=1-2
5、bookHistory=2-1 3 bookHistory=3-2-1
6、bookHistory=1-2-3 2 bookHistory=2-1-3
7、bookHistory=1-2-3 4 bookHistory=4-1-2
*/
private String makeids(HttpServletRequest request, String bookid) {
Cookie []cos=request.getCookies();
//* 1 无cookie
if(cos==null){
return bookid;
}
//2有cookie,但无book,
Cookie bookHistory =null;
for(Cookie c:cos){
if("book".equals(c.getName())){
bookHistory=c;
break;
}
}
if(bookHistory==null){
return bookid;
}
/*
* 3cookie为1 2 2-1
* 4cookie为2-1 1 1-2
* 5cookie为2-1 3 3-2-1
*/
//获取到浏览器传来的cookie
String value=bookHistory.getValue();
String []ids=value.split("\\-");
LinkedList<String> list=new LinkedList<String>(Arrays.asList(ids));
if(list.size()<3){
//情况4
if(list.contains(bookid)){
list.remove(bookid);
} //情况5
list.addFirst(bookid);
}
/*
* 6cookie为3-2-1 2 2-3-1
* 7cookie为3-2-1 4 4-3-2
**/
else{
if(list.contains(bookid)){
list.remove(bookid);
}else{
list.removeLast();
}
list.addFirst(bookid);
}
//2-3-1这样的形式
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();
}