JAVA从零学re从零开始的JAVA学习04——<javaEE阶段三基础版>

 

 

 

day04 cookie、session、EL表达式、过滤器和监听器和AJAX跨域

1.cookie和session

cookie

cookie的概念:Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种

方式。Cookie 是由 Web 服务器保存 在用户浏览器(客户端)上的小文本文件,它可以包含

有关用户的信息。无论何时用户链接到服务器,Web 站点 都可以访问 Cookie 信息 。 

cookie是浏览器本地使用的 作用可以存储本地的用户信息 

在访问服务器时会携带指定的cookie供服务器使用  服务器也可以返回指定的cookie数据 

cookie的基本使用

  • 创建对象  Cookie cookie = new Cookie("key", "value");
  • 回写客户端response.addCookie(cookie);
  • 获取对象  Cookie[] cookies = request.getCookies(); 

cookie存储在浏览器中 setMaxAge() 有过期时间

 1 // 创建 cookie
 2         Cookie age = new Cookie("age", "100year");
 3         // 添加到响应中 , 没有设置时间 ,浏览器关闭 ,cookie消失了.
 4         response.addCookie(age);
 5         Cookie age2 = new Cookie("age2", "1minute");
 6         // 设置时间为 60秒
 7 //        age2.setMaxAge(60);
 8         // 设置时间为 最大值秒  -2087年
 9         age2.setMaxAge(Integer.MAX_VALUE);
10 
11         //设置时间  , 单位秒
12         response.addCookie(age2);

所以清除cookie可以将存在时间设置为零  cookie存储的key值是唯一的当有相同的key时后面的会覆盖前面的

服务器可以指定Cookie的携带路径 (setPath(“/?”))在请求指定页面时才会携带指定的cookie

 1           // 创建 cookie  对象
 2 
 3         Cookie cookie = new Cookie("name", "pppp");
 4 
 5         // 设置携带路径     , 访问 /p时, 此cookie 携带到服务器
 6         cookie.setPath("/web11/p");
 7 
 8         // 添加到响应
 9         response.addCookie(cookie);
10 
11         // 解析
12         Cookie[] cookies = request.getCookies();
13 
14         if (cookies!=null){
15 
16             System.out.println(cookies.length);
17         }

原理

 Cookie的应用:记住用户名、携带用户信息自动登入(不是自动 记住用户名和密码)

案例、记录用户上一次登入的时间

 1 @WebServlet(name = "TimeServlet",urlPatterns = "/time") public class TimeServlet extends HttpServlet {
 2  
 3     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 4      / /第一次访问操作        // 1 获取用户当前访问的时间         
 5     Date date = new Date();
 6 //格式化时间数据(注意:在cookie值中不能使用分号(;)、逗号(,)、等号(=)以及空格,否则会出 现异常) 
 7 
 8   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd/hh:mm:ss");                 
 9   String format1 = format.format(date);       
10   System.out.println(format1);
11 
12  // 2 将数据存入cookie        
13  Cookie cookie = new Cookie("time", format1);         cookie.setMaxAge(60*60*24); 
14 //第二次访问操作         //获取cookie数组         
15 Cookie[] cookies = request.getCookies();        
16 if(cookies != null) {            for (Cookie cookie2 : cookies) {
17   //选择获取名称为time的cookie              
18   if("time".equals(cookie2.getName())) {                   
19  //将数据发送页面                  
20   response.getWriter().write(cookie2.getValue());       
21          }       
22      }    
23     }    
24 }

session

概念当浏览器访问Web服务器时,Servlet容器就会创建一个Session对 象和ID属性,其中,Session对象就相当于

病历档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将 标识号传递给服务器,服务器就能判断出该

请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。

当浏览器首次访问服务器时 服务器会自动生成一个session用来存储客户端的数据 并返回一个带有ID的Cookie数据 生成唯一id值 , 叫做JSESSIONID

在客户端下次访问服务器端时会根据携带的cookie的ID值 来找到客户端存储的session使用 

session的存储时间默认是30分钟  很多网站在长时间未操作需要重新登入就时session过期

基本使用

  • 获取session对象  HttpSession getSession()  获取session对象   
  • 使用对象

    void setAttribute(String name, Object value) 在session中保存数据

    Object getAttribute(String name)  从session中获取数据

    void removeAttribute(String name)  从session中移除数据

  • 销毁session对象 手动销毁 : 调用方法session.invalidate(); 

原理:cookie可以设置生存周期

 案例:登入验证码验证

前端页面

 1 <form class="form-horizontal" action="/web11/login" method="post">
 2 
 3                     <div class="form-group">
 4                         <label for="username" class="col-sm-2 control-label">用户名</label>
 5                         <div class="col-sm-6">
 6                             <input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名">
 7                         </div>
 8                     </div>
 9                     <div class="form-group">
10                         <label for="inputPassword3" class="col-sm-2 control-label">密码</label>
11                         <div class="col-sm-6">
12                             <input type="password" class="form-control" id="inputPassword3" name="password"
13                                    placeholder="请输入密码">
14                         </div>
15                     </div>
16                     <div class="form-group">
17                         <label for="checkCode" class="col-sm-2 control-label">验证码</label>
18                         <div class="col-sm-3">
19                             <input type="text" class="form-control" id="checkCode" name="checkcode" placeholder="请输入验证码">
20                         </div>
21                         <div class="col-sm-3">
22                             <img src="/web11/checkcode" onclick="changeImg(this)"/>
23                         </div>
24                         <div>
25                             <%=request.getAttribute("checkcode_msg") == null ?"" :request.getAttribute("checkcode_msg")%>
26                         </div>
29                     </div>
30                     <div class="form-group">
31                         <div class="col-sm-offset-2 col-sm-10">
32                             <div class="checkbox">
33                                 <label>
34                                     <input type="checkbox"> 自动登录
35                                 </label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
36                                 <label>
37                                     <input type="checkbox"> 记住用户名
38                                 </label>
39                             </div>
40                         </div>
41                     </div>
42                     <div class="form-group">
43                         <div class="col-sm-offset-2 col-sm-10">
44                             <input type="submit" width="100" value="登录" name="submit" border="0"
45                                    style="background: url('./img/login.gif') no-repeat scroll 0 0 rgba(0, 0, 0, 0);
46     height:35px;width:100px;color:white;">
47                         </div>
48                     </div>
49 </form>
50 ---------------------------------
51 <script type="text/javascript">
52     function changeImg(img) {
53       //alert("xx");
55         /*
56          将 图片的src属性进行重新赋值
57          浏览器 请求资源 , 检查自己缓存 , src请地址与 原来地址一模一样 ,并没有发送新的请求,
58          而是从原有缓存中获取 , 图片也就没有发生改变.
59          =======================================
60          解决方案 :  地址肯定不能变  ,  携带参数 , 此参数要求每次提交都发生变化.
62           */
63         img.src ="/web11/checkcode?t="+Date.now();
64 
65     }
66 </script>

 后端处理

获取验证码

     // 1. 生成验证码 String srcCode = "ASDFGHJKLasdfghjkl1234567890"; // 创建StingBuilder StringBuilder stringBuilder = new StringBuilder(); // 创建 Random Random r = new Random(); // 四位验证码 ,4次循环 for (int i = 0; i < 4; i++) { // 随机获取 字符 char ch = srcCode.charAt(r.nextInt(srcCode.length())); // 拼接字符 stringBuilder.append(ch); } // 保存 验证码 request.getSession().setAttribute("checkcode" , stringBuilder.toString()); // 2. 通过内容生成一张图片. (工具类 ) BufferedImage img = ImgUtils.getCheckImg(stringBuilder.toString()); // 3. 回写 图片. ImageIO.write(img, "jpg" , response.getOutputStream());
登入处理
//
获取数据 用户名和 密码 和验证码 // 用户名 /密码 --> 查询数据 自己做 // 1.获取提交的验证码 String checkcode = request.getParameter("checkcode"); // 2. 从session 获取验证码 . Object session_checkcode = request.getSession().getAttribute("checkcode"); // 3. 验证码 比较 忽略大小写的比较 . // 不成功 , 不再执行其他的功能 if (!checkcode.equalsIgnoreCase(session_checkcode.toString())){ // 判断 并回写 数据 request.setAttribute("checkcode_msg" , "验证码有误"); // 转发 request.getRequestDispatcher("/login.jsp").forward(request, response); return; }

 步骤就是 jsp请求页面验证码img标签属性src请求页面 返回服务端接受数据返回验证码图片 点击图片时发送请求 携带不同参数是为了成功请求

 填写验证码点击登入提交表单  session存储checkcode数据 默认过期时间为30分钟 或者 刷新验证码  登入成功跳转页面 失败刷新验证码 显示信息

 cookie和session是配合使用的  它们之间的区别

 2.EL表达式

 概念:EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,

   EL 出现的目的是要替代jsp页面中输 出脚本的编写

EL表达式作用一:从域中取出数据

  • EL获得request域中的值:${requestScope.key};
  • EL获得session域中的值:${sessionScope.key};
  • EL获得application域中的值:${applicatioScope.key};
  • EL从四个域中获得某个值${key};

同样是依次从pageContext域,request域,session域,application域中 获取属性,在某个域中获取后 将不在向后寻找

 

EL的内置对象
获取JSP中域中的数据(pageScope,requestScope,sessionScope,applicationScope)
pageContext - WEB开发中的pageContext.

  • 获得web应用名称:${pageContext.request.contextPath}
  • 在Servlet中获得web应用的名称:request.getContextPath();
  • 在jsp页面上获得web应用的名称:${pageContext.request.contextPath}

 3. JSTL的核心标签库使用

导包

 

 

 常用的jstl标签

  • <c:if>标签

 

 

 使用

  • < forEach>标签

 

 

 

使用

 

 待完善...

3.过滤器和监听器

Filter过滤器

原理

 

 

 实现

 

 

 

 

 

可以使用@WebFilter代替xml配置

 

 在多个多滤器 执行时 是按自然顺序过滤的

 在拦截是不会拦截请求装发的访问 解决

 

 小案例:解决中文乱码问题

监听器Listener

概念:监听器就是监听某个对象的的状态变化的组件 监听器的相关概念:

事件源:被监听的对象 ----- 主要三个域对象 request session servletContext

监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 ----

响应 行为:监听器监听到事件源的状态变化时 所涉及的功能代码 ---- 

监听器有那些:

第一维度:按照被监听的对象划分:ServletRequest域 HttpSession域 ServletContext域

第二维度:安装监听的内 容分:监听域对象的创建与销毁的监听域对象的属性变化的

 

 例:

 

 

 配置xml文件

 

 

 或使用注解

 

 

 

posted @ 2020-03-14 17:44  袁德华  阅读(168)  评论(0)    收藏  举报