您的位置:首页 > 编程语言 > Java开发

简单理解Cookie及其应用

2016-07-31 16:18 330 查看

Cookie

概念:小点心。服务器向客户端发送的一段小文本,意味着Cookie存放在客户端,所以安全性差。Cookie在Web开发中设计为键值对(字符串)。

Cookie分为两大类:

1)浏览器缓存Cookie

a)没有调用setMaxAge()
b)浏览器打开子窗体会共享缓存

2)持久化Cookie

在一个浏览器上最多支持300个Cookie,Cookie最大支持4KB,同一个域名的Cookie最多20个。

Cookie的API

1)setPath

a)前提是http://localhost/servlet_4/servlet/cookie添加cookie
b)一般情况下,setPath(path值)尽量与添加cookie的路径一致
c)setPath(“/servlet_4”)

2)setMaxAge():给Cookie设置生命周期

a)负数:Cookie是基于浏览器缓存的Cookie
b)0:Cookie会删除
c)正数:Cookie则为持久化Cookie

案例:

1)查看之前登录网站的时间

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset:UTF-8");
PrintWriter out= response.getWriter();
out.write("上次访问的时间:");

Cookie[] cookies= request.getCookies();
for (int i = 0;cookies!=null&& i < cookies.length; i++) {
Cookie cookie = cookies[i];
if(cookie.getName().equals("histroy")){
//把String转换成date
String histryValue=cookie.getValue();
long date=Long.parseLong(histryValue);
Date date1=new Date(date);
out.write(date1+"<br/>");
}
}
//产生新的cookies
Cookie cookie=new Cookie("histroy",System.currentTimeMillis()+"");
cookie.setPath("/");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);

2)登录时记住密码

//CookiesUtils工具类

public class CookieUtils {

public static void addCookie(HttpServletResponse response, String name, String Value,int time){

if(response==null){
return;
}
if(name.trim().equals("")){
throw new IllegalArgumentException();
}
//创建一个cookie对象
Cookie cookie=new Cookie(name,Value);
cookie.setPath("/");
cookie.setMaxAge(time);
response.addCookie(cookie);

}
public static String getCookie(HttpServletRequest request,String name) {
if(request==null){
throw new IllegalArgumentException();
}
if(name.trim().equals("")){
throw new IllegalArgumentException();
}
Cookie[] cookies = request.getCookie();
for (int i = 0; cookies!=null&&i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals(name)) {
return cookie.getValue();
}
}
return null;
}
}

------------------------------------------------------
//登录表单处理servlet

request.setCharacterEncoding("UTF-8");

response.setHeader("Cache-Control","no-cache");

response.setHeader("Expires","-1");

response.setHeader("Pragma","no-cache");
//获得表单元素

String name = request.getParameter("name");
String password = request.getParameter("password");
String remember = request.getParameter("rememberMe");

List<User> list=Db.getAll();

String cookiesValue=CookiesUtils.getCookies(request,"login");
//获取login cookie的值判断是否为空,为空则不是记住密码
if(!StringUtils.isBlank(cookiesValue)){

if(cookiesValue.equals(name+"-"+password)){

if("N".equals(remember)){
//将时间设为0,销毁login cookie(覆盖之前的cookie)
CookieUtils.addCookie(response,"login","",0);

}
request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}

}
//在没记住密码的情况下登录,查数据库验证登录

for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if (name.equals(user.getUsername()) && password.equals(user.getPassword())) {

if ("Y".equals(remember)) {
//记住密码,将姓名和密码当做是login的值

CookiesUtils.addCookies(response, "login", name + "-" + password,3600*24);

}
//登录成功转发到指定页面

request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}

}
//登录失败返回登录页面

request.getRequestDispatcher("/login.jsp").forward(request, response);

}

3)浏览历史列表

//记录历史列表servlet
//从链接中获取查看过的id
String id = request.getParameter("id");
//用于拼接观看过的所有id
StringBuffer sb = new StringBuffer();
//获得histroy cookie的值
String Value = CookieUtils.getCookies(request, "history");
//判断有没有histroy cookie,有则拼接id
if (Value != null) {
sb.append(Value);
sb.append("-" + id);
//跟新cookie
CookieUtils.addCookies(response, "history", sb.toString(), 60*60);
}else {
CookieUtils.addCookies(response, "history", id, 60*60);
}
-----------------------------------------------

//查看历史列表处理servlet
String value= CookieUtils.getCookies(request,"history");
List<Book> list=new ArrayList<Book>();
//从数据库获得书
Map bookMap=Db2.getAll();
if(value!=null){
//把history cookie里面的值进行分解成id
String[] ids= value.split("-");
for (String id : ids) {
list.add((Book) bookMap.get(id));
}
//把历史列表的书写到request域里面
request.setAttribute("bookList",list);
}
//转发到小显示页面
request.getRequestDispatcher("/BookList.jsp").forward(request,response);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javaweb