javaee(cookie和session)
来源:互联网 发布:搜狗输入法云计算进程 编辑:程序博客网 时间:2024/05/17 04:18
cookie记录最后浏览时间
@WebServlet(urlPatterns = "/demo1")public class demo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/css; charset=utf-8"); PrintWriter writer = resp.getWriter(); //获取客户端最后访问时间 Cookie[] cookies = req.getCookies(); for(int i=0;cookies!=null&&i<cookies.length;i++){ if("last".equals(cookies[i].getName())) writer.write("你最后访问的时间是"+new Date().toLocaleString()); } //创建cookie,并把信息写回客户端 Cookie ck=new Cookie("last",System.currentTimeMillis()+""); //写入cookie resp.addCookie(ck); }}默认情况下cookie存续浏览器内存中,用户退出浏览器就删除,若希望浏览器将cookie存储在磁盘中
则需要maxAge,以秒为单位时间,最大值设0则是命令浏览器删除该cookie。
注意!!!
上下文中的不同地址的cookie是可以访问的,但前提是访问的路径以cookie的path开始的路径,浏览器就带,否则不带。
如果想让上下文都可以访问cookie,则使用cookie.setPath("/上下文名称"),来设置为顶层的cookie
ck.setPath("/上下文名称");//低级 ck.setPath(req.getContextPath());//中级 上下文名称 ck.setPath("/");//高级 这个和上面等同,当前上下文的名称
保存用户名
js网页 在jsp获得cookie和在获取cookie后checked保持选择状态
<html><head> <title>Title</title></head><body> <%Cookie[] c=request.getCookies(); String name=""; String checked=""; for(int i=0;c!=null&&i<c.length;i++){ if(c[i].getName().equals("user")){ name=c[i].getValue(); checked="checked='checked'"; } } %> <form action="${pageContext.request.contextPath}/cookie1" method="post"> 姓名:<input name="name" type="text" value="<%=name%>"> 密码:<input name="pwd" type="password"> 记住用户名:<input id="remember" type="checkbox" name="remember" <%=checked%>> <input type="submit" value="登录"> </form></body></html>servlet注意:path设置全局路径,获得表单文本控件没有输入为空字符串,而单选按钮和button则为null。
@WebServlet(urlPatterns = "/cookie1")public class CookieDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); PrintWriter writer = resp.getWriter(); String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); String remember = req.getParameter("remember"); Cookie ck=new Cookie("user",name); ck.setPath("/"); if("tom".equals(name)&&"123".equals(pwd)){ //表单类型不输入是空字符串,但是复选框和单选按钮不选是null if(remember!=null){ ck.setMaxAge(Integer.MAX_VALUE); }else{ ck.setMaxAge(0); } resp.addCookie(ck); writer.write("登录成功!"); }else{ writer.write("登录失败"); //设置两秒跳到重新登录 resp.setHeader("refresh","2;url="+req.getContextPath()+"/denglu.jsp"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); }}浏览器历史记录
//实体类(书)
public class Book { private String id; private String name; private String price; private String author; public Book(String id, String name, String price, String author) { this.id = id; this.name = name; this.price = price; this.author = author; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; }}数据源(采用map存的数据,返回单个Book和整个map)
public class DBUtil { private static Map<String,Book> books=new HashMap<>(); static { books.put("1",new Book("1","java编程思想","20","小明")); books.put("2",new Book("2","java深入虚拟机","25","小明")); books.put("3",new Book("3","java设计模式","10","小明")); books.put("4",new Book("4","java并发","10","小明")); books.put("5",new Book("5","python编程","10","小明")); } //获取所有的书map类型 public static Map<String,Book> getBooks(){ return books; } //获取指定的书 根据id public static Book findBook(String id){ return books.get(id); }}主页列出所有书籍(并且查看是否有对应的cookie)
@WebServlet(urlPatterns = "/showBook")public class ShowAllBookServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); Map<String, Book> books = DBUtil.getBooks(); PrintWriter writer = resp.getWriter(); writer.write("本网站的有以下的好书:<br/>"); for (Map.Entry<String,Book> book:books.entrySet()) { writer.write("<a href='"+req.getContextPath()+"/findBook?id="+book.getValue().getId()+"' target='_blank'>"+book.getValue().getName()+"</a><br>"); } writer.write("<hr/>你最近浏览过的书有:<br/>"); Cookie[] ck = req.getCookies(); for(int i=0;i<ck.length;i++){ //cookie带historyBookId的是浏览记录的id序列,进行切割获取id队友的Book(队列) if("historyBookId".equals(ck[i].getName())){ String value=ck[i].getValue(); String[] valuess = value.split("-"); for (String s:valuess) { Book book = DBUtil.findBook(s); writer.print(""+book.getName()); } } } }}点击查看单个书籍,并且添加到cookie中
@WebServlet(urlPatterns = "/findBook")public class findBook extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); //获取get提交id参数 String id = request.getParameter("id"); Book book = DBUtil.findBook(id); PrintWriter writer = response.getWriter(); writer.write("书籍名称:" + book.getName() + "<br>"); writer.write("书籍价格:" + book.getPrice() + "<br>"); writer.write("书籍作者:" + book.getAuthor() + "<br>"); //把当前浏览过的书写会回到客户端 String historyBook = organzeId(id, request); Cookie ck = new Cookie("historyBookId", historyBook); ck.setPath("/"); ck.setMaxAge(Integer.MAX_VALUE); response.addCookie(ck); } /** * 没有cookie 把当前的id给添加进去 * 有cookie,但是没有historyBookId 把当前的id给添加进去 * historyBookId 2 */ private String organzeId(String id, HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies == null) { //如果没有cookies就直接返回当前id return id; } //查找cookies名字是historyBookId的 Cookie historyBookId = null; for (int i = 0; i < cookies.length; i++) { if("historyBookId".equals(cookies[i].getName())){ historyBookId=cookies[i]; } } if(historyBookId==null){ return id; } //不管存储几个 String value = historyBookId.getValue(); String[] values = value.split("-"); LinkedList<String> ls = new LinkedList<>(Arrays.asList(values)); //历史记录最多保持3个(队列 先进先出) if(ls.size()<3){ //如果浏览记录里面有重复的id就删除掉。 if(ls.contains(id)){ ls.remove(id); } }else{ //超过3个就浏览记录就删除最后一个或者包含的id if(ls.contains(id)){ ls.remove(id); }else{ ls.removeLast(); } } ls.addFirst(id);//添加到最前面 StringBuffer sb = new StringBuffer(); for (int i=0;i<ls.size();i++){ if(i>0){ sb.append("-"); } sb.append(ls.get(i)); } return sb.toString(); }}
HttpSession对象原理
1.获取名称为JSESSIONID的cookie的值
2.没有这样的cookie,创建一个新的session对象,分配唯一的SessionId,并且向客户端写一个名字叫JSESSION=sessionID的cookie
3.有这个样的Cookie,获取cookie的值,从服务器内存中根据ID找那个session对象。
HttpSession对象状态
出生request.getSession();
活着:应用运行时
搁置:内存溢出,服务器重启,会在tomcat目录的work下持久化,等启动服务器后,session就自动的回调进内存(放心大胆的重启服务器,不用担心session的丢失)
持久化:存盘,IO实现serializable
死亡:超时,默认30分钟,setMaxInactiveInterval(int);
Session,invalidate();强制销毁
在xml中配置<session-config>单位分钟
session是一个域对象,可以存储对象
getId()获取对象,setMaxInactiveInterval(int )设置session存活时间,秒做单位
invalidate()使得会话无效
cookie客户端技术,只能存取字符串
客户端禁用Cookie后回话数据保存问题
解决方案:
1.在主页上给出提示,请不要禁用cookie。
2.URL重写。必需对网站的所有地址都重写。(刷新会有问题)
http://url -->http://url;JSESSIONID=111
response.encodeURL(String url);//前提写上request.getSession()不然没用作用
看到浏览有没有发送cookie请求的消息头,没有就重写URL,有就不重写。
- javaee(cookie和session)
- 【JavaEE】cookie和Session
- javaee之cookie和session的见解和练习
- JavaEE——Session与Cookie的区别和联系
- JavaEE中的Cookie与Session
- JavaEE学习05--cookie&session
- javaEE 深入理解 Session 与 Cookie
- session和cookie
- Cookie和Session专题
- Cookie和Session专题
- Cookie和Session专题
- Cookie和Session专题
- 关于Session和Cookie
- Cookie和Session专题
- session 和 cookie
- Cookie和Session专题
- cookie和session
- 浅谈Session和Cookie
- 线程的创建方式
- Centos7无法上网
- Linux系统知识小结(十)
- Linux中进程问题
- liunx 下安装Zookeeper
- javaee(cookie和session)
- Codeforces Round #444 (Div. 2)-C-Solution for Cube(魔方一步还原)
- C和指针之函数之递归实现厄密多项式
- Java 枚举(enum) 详解7种常见的用法
- 【LeetCode】581.Shortest Unsorted Continuous Subarray(easy)解题报告
- 文件的复制
- 11.7每日一练2
- 微信可以这样玩
- 锚点标签的3个页面跳转练习页面