回顾

  1. 1.JSP
  2. 特殊的servlet 会被转成.java文件,然后编译成.class文件
  3. servlet通过dao层去将数据库的数据取出来,取出来以后
  4. 使用request.setAttribute(键,值)转发给jsp页面
  5. request.geetRequestDispathcer(转发地址).forward(request,response)
  6. 传给JSP页面以后可以使用 el表达式${键} jstl 将数据取出来,展示在html标签中
  7. 将案例进行完善修改,换成jsp页面

一、过滤器

JavaWeb有三大组件:servlet filter(过滤器) listener(监听器)

1.1Filter过滤器

  1. 包括咱们写的网站,使用过滤器了没﹖咱们现在还得自己手写url输入login.jsp,能不能使用过滤器进行过滤﹖无论你请求任何资源我都会进行过滤,只让login.jsp页面通行,所以这个一弄上去以后就显示login.jsp
  2. 作用:验证信息登录 处理字符集的问题 过滤跳转等

1.2过滤器图解

1.3Filter入门

1.新建一个FilterDemo1类,这个类实现Filter接口

2.三个方法

  1. init方法:初始化Filter,现有F
  2. doFilter方法:核心方法
  3. destroy方法:销毁方法
  1. package com.qfedu.filter; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-12-9:49
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.annotation.*;
  7. import java.io.IOException;
  8. //@WebFilter("/*") 是拦截的路径 拦截所有资源
  9. @WebFilter("/*")
  10. //@WebFilter(filterName = "FilterDemo1")
  11. public class FilterDemo1 implements Filter {
  12. public FilterDemo1(){
  13. System.out.println("Filter被实例化");
  14. }
  15. public void init(FilterConfig config) throws ServletException {
  16. System.out.println("filter初始化");
  17. }
  18. public void destroy() {
  19. System.out.println("Filter销毁");
  20. }
  21. //核心方法
  22. @Override
  23. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
  24. System.out.println("111111");
  25. // chain.doFilter(request,response);//放行代码
  26. System.out.println("2222222");
  27. //将放行代码注释掉,就意味着拦截所有资源不放行
  28. }
  29. }

1.4执行流程

1.浏览器访问资源的时候,先去匹配@WebFilter的路径,会被拦截(要么放行值执行其他资源,要么拦截回到客户端)

2.先去执行Filter

3.看是否满足条件,满足就放行

4.放行资源以后,执行完资源以后再回到Fliter里面

请求==》过滤器==》资源(servlet、jsp)》过滤器》客户端

1.5Fliter生命周期

1.实例化Filter

2.初始化Fliter ,实例化和初始化都是一次

3.doFliter()核心方法

4.销毁,tomcat服务器关闭的时候销毁

重点:servlet先销毁,filter后销毁

因为servlet执行完销毁,然后回到filter

1.6过滤器拦截路径问题

1.精准拦截

  1. @WebFliter(“/TestServlet1”) 只拦截这一个资源

2.拦截一个目录

  1. @WebFilter(“/user/*”) 拦截user下的所有资源

3.拦截指定后缀的

  1. @WebFilter(“*.jsp”)

4.拦截所有资源 只用这个

  1. **@WebFilter(“/_”)_

1.7过滤器综合案例

功能型网站、展示型网站

还用昨天的项目案例E:\idea_workspace\day47_510anli2

使用过滤器,写项目时,最后加过滤器(项目可以整除运行时在加过滤器)

1.7.1登录拦截

1.流程第一次运行服务器,URI是/day47_510anli2/

  1. if(requestURI.endsWith("/login.html") || requestURI.endsWith("/LoginServlet")){
  2. //放行
  3. chain.doFilter(request,response);
  4. }

2.进入login.html 再次执行拦截器 这时候URI是/day47_510anli2/login.html

  1. else if(session == null || session.getAttribute("user") == null){
  2. //不放行 跳转到login.html
  3. response.sendRedirect("login.html");
  4. }

3.进入LoginServlet 设置了setAttribute(“user”,user)

所以以后每次执行servlet 都可以执行

  1. else if (session.getAttribute("user") != null){
  2. //放行
  3. chain.doFilter(request,response);
  4. }

然后都可以放行

  1. package com.qfedu.fliter; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-12-10:56
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.annotation.*;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10. import java.io.IOException;
  11. @WebFilter("/*")
  12. public class LoginFilter implements Filter {
  13. public void init(FilterConfig config) throws ServletException {
  14. Filter.super.init(config);
  15. }
  16. public void destroy() {
  17. Filter.super.destroy();
  18. }
  19. @Override
  20. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
  21. //第一步 使用HttpServlet的参数 子类比父类强 ServletRequest里没有getSession方法
  22. HttpServletRequest request = (HttpServletRequest) servletRequest;
  23. HttpServletResponse response = (HttpServletResponse) servletResponse;
  24. //过滤器的核心,现在拦截所有
  25. //有session和没有session值的两种方案
  26. //有session就证明登录过了,没有证明没有登录
  27. //有session就放行,没有session就拦截跳转到login.jsp
  28. HttpSession session = request.getSession();
  29. System.out.println("1111filter:session:" + session);
  30. //如果session为null,就会直接跳转到login.jsp页面
  31. //url的一部分 /day47_510anli2/ 统一资源标识符
  32. String requestURI = request.getRequestURI();
  33. System.out.println("2222" + requestURI);
  34. //是否放行 以下if else 顺序不能换
  35. if(requestURI.endsWith("/login.html") || requestURI.endsWith("/LoginServlet")){
  36. //放行
  37. chain.doFilter(request,response);
  38. }else if(session == null || session.getAttribute("user") == null){
  39. //不放行 跳转到login.html
  40. response.sendRedirect("login.html");
  41. }else if (session.getAttribute("user") != null){
  42. //放行
  43. chain.doFilter(request,response);
  44. }
  45. }
  46. }

二、jquery

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <!-- 引入外部js文件,封装好的js -->
  7. <!-- 一旦引入成功就可以数学符合jQuery语法格式的代码了 -->
  8. <!-- 第一种引入方式 引入本机js文件 -->
  9. <script src="jquery-3.4.1.min.js"></script>
  10. <!-- 第二种进入方式 引入网络上面的CDN的js文件 -->
  11. <!-- 必须得有网,没有网就不能写jQuery语法格式的代码 -->
  12. <!-- <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> -->
  13. </head>
  14. <body>
  15. </body>
  16. <!-- 一定要记住,jQuery是js的封装,所以写的是js代码 -->
  17. <script>
  18. //匿名函数 jQuery的功能
  19. $(function(){
  20. //功能代码
  21. alert("呼叫博儿")
  22. })
  23. </script>
  24. </html>