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>      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文件

或使用注解


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号