第 11 章 web11-Cookie&Session 篇
1.1 上次课内容回顾:
Response
* 通过 response 设置状态码: setStatus(int status);
* 通过 response 设置响应头: setHeader(String name,String value);,setIntHeader(String name,int value),setDateHeader(String name,long date);
* 通过 response 设置响应体: getOutputStream(),getWriter();
* response 的其他的 API:
* sendRedirect(String path);
* response 输出中文的乱码问题:
* 字节流输出中文:
* 设置浏览器的字符集编码. response.setHeader("Content-Type","text/html;charset=UTF-8");
* 设置输出内容的字节数组的字符集编码. "".getBytes("UTF-8");
* 字符流输出中文:
* 设置浏览器字符集编码. response.setHeader("Content-Type","text/html;charset=UTF-8");
* 设置 response 的缓冲区的编码. response.setCharacterEncoding("UTF-8");
* response 完成了文件下载功能:
Request
* 使用 request 获得客户机的信息. getRemoteAddr(),getMethod(),getRequestURI(),getRequestURL()
* 获得请求参数: getParameter(),getParameterValues(),getParameterMap()
* 作为域对象存取数据: setAttribute(),getAttribute(),removeAttribute();
* 接收参数的中文乱码的处理:
- * GET :new String("".getBytes("ISO-8859-1"),"UTF-8")
- * POST :request.setCharacterEncoding("UTF-8");
* request 何时创建和销毁的?
* 创建: 从客户端向服务器发送请求. 那么服务器创建一个 request 对象.
* 销毁: 服务器为这次请求作出了响应之后, 服务器就会销毁 request 对象.
* 作用范围: 一次请求.
* 转发和重定向区别?
* 转发是一次请求一次响应, 重定向两次请求和两次响应.
* 转发地址栏不变, 重定向会变化.
* 转发的路径不需要加工程名, 重定向需要加工程名.
* 转发只能在本网站内部, 重定向可以定向到任何网站.
1.2 案例一: 记录用户的上次登陆访问时间. 1.2.1 需求:
用户登录完成后, 显示您是第 x 位访问的用户, 您的上次访问时间是: yyyy-MM-dd.
* 如果第一次访问的话, 只显示您是第 x 位用户.
* 如果不是第一次访问的话, 显示您是第 x 位访问的用户, 您的上次访问时间是: yyyy-MM-dd.
1.2.2 分析: 1.2.2.1 技术分析:
[会话技术]
? 什么是会话 : 用户打开一个浏览器访问页面, 访问网站的很多页面, 访问完成后将浏览器关闭的过程称为是一次会话.
? 常见的会话技术:
* Cookie : 将数据保存到客户端浏览器.
* Session : 将数据保存到服务器端.
? 为什么使用会话技术?
* 私有的数据, 购物信息数据保存在会话技术中.
参见图一和图二
? 使用会话技术:
[Cookie 技术的使用]
? 向浏览器保存数据:
HttpServletResponse 有一个方法:
* void addCookie(Cookie cookie);
? 获得浏览器带过来的 Cookie:
HttpServletRequest 有一个方法:
* Cookie[] getCookies();
? 创建一个 Cookie 对象:
* Cookie(String name,String value);
[JSP 的简单概述]
? 什么是 JSP :Java Server Pages(Java 服务器端页面).JSP = Java 代码 + HTML 的元素 + JSP 内置东西
? SUN 公司为什么推出 JSP 动态网页开发技术:
* SUN 公司推出的 Servlet 技术进行动态网页开发. 发现 Servlet 自身有不足没有办法与 ASP,PHP 技术竞争. 想在动态网页中输出表单. 在 Servlet 中获得 PrintWriter out = response.getWriter();
- * out.println("<form action='' method=''>");
- * out.println("</form>");
* SUN 又推出了动态的网页开发技术就是 JSP.
? JSP 的执行过程:
* JSP 会被翻译成 Servlet, 编译成 class 进行执行的.
? JSP 的嵌入 Java 代码: JSP 的脚本元素
* <%! %> : 翻译成类中的成员部分. 定义变量, 定义方法, 定义类. Servlet 是线程不安全的, 尽量少在类中定义成员属性!!
* <% %> : 翻译成类的 service 方法内部的内容. 定义变量, 定义类, 直接写代码块.
* <%= %> : 翻译成 service 方法内部的 out.print();
1.2.2.2 步骤分析:
[步骤一] : 准备登陆的案例.
[步骤二] : 在统计人数的 Servlet 中. 判断是否是第一次访问.
[步骤三] : 根据是否是第一次显示不同的信息, 同时将当前的时候保存到 Cookie 中.
1.2.3 代码实现
- public class CountServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- response.setContentType("text/html;charset=UTF-8");
- Integer count = (Integer) this.getServletContext().getAttribute("count");
- // response.getWriter().println("<h1 > 现在网站被访问的次数为:"+count+"</h1>");
- /**
- * 获得浏览器中带过来的所有的 Cookie 信息, 从数组中查找有没有指定名称的 Cookie
- * 判断用户是否是第一次访问:(从数组中没有找到指定名称的 Cookie)
- * * 如果是第一次: 显示欢迎, 记录当前访问的时间存入到 Cookie 中.
- * * 如果不是第一次: 显示欢迎, 上一次访问时间, 同时记录当前访问的时间存入到 Cookie 中.
- */
- // 获得浏览器带过来的所有的 Cookie:
- Cookie[] cookies = request.getCookies();
- // 从数组中查找指定名称的 Cookie:
- Cookie cookie = CookieUtils.findCookie(cookies, "lastVisit");
- // 判断是否是第一次:
- if(cookie == null){
- // 第一次访问
- response.getWriter().println("您是第"+count+"位访客!");
- }else{
- // 不是第一次
- Long l = Long.parseLong(cookie.getValue());
- Date d = new Date(l);
- response.getWriter().println("您是第"+count+"位访客! 上次访问时间是:"+d.toLocaleString());
- }
- // 创建一个 Cookie 对象:
- Cookie c = new Cookie("lastVisit",""+System.currentTimeMillis());
- // 保存到浏览器端:
- response.addCookie(c);
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doGet(request, response);
- }
- }
1.2.4 总结: 1.2.4.1 Cookie 的常用 API:
? Cookie 的常用的 API:
- * getName();
- * getValue();
* setDomain(String domain); -- 设置 Cookie 的有效域名. // [url]www.baidu.com[/url] music.baidu.com
* setPath(String path); -- 设置 Cookie 的有效路径.
* setMaxAge(int maxAge); -- 设置 Cookie 的有效时间.
? Cookie 的分类有关:
* 会话级别的 Cookie: 默认的 Cookie. 关闭浏览器 Cookie 就会销毁.
* 持久级别的 Cookie: 可以设置 Cookie 的有效时间. 那么关闭浏览器 Cookie 还会存在. 手动销毁持久性 Cookie. setMaxAge(0)--- 前提是有效路径必须一致.
来源: http://www.bubuko.com/infodetail-2613612.html