Filter:过滤器

  1. 1. 概念:
  2. * 生活中的过滤器:净水器,空气净化器,土匪、
  3. * web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
  4. * 过滤器的作用:
  5. * 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...
  6. 2. 快速入门:
  7. 1. 步骤:
  8. 1. 定义一个类,实现接口Filter
  9. 2. 复写方法
  10. 3. 配置拦截路径
  11. 1. web.xml
  12. 2. 注解
  13. 2. 代码:
  1. @WebFilter("/*")//访问所有资源之前,都会执行该过滤器
  2. public class FilterDemo1 implements Filter {
  3. @Override
  4. public void init(FilterConfig filterConfig) throws ServletException {
  5. }
  6. @Override
  7. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  8. System.out.println("filterDemo1被执行了....");
  9. //放行
  10. filterChain.doFilter(servletRequest,servletResponse);
  11. }
  12. @Override
  13. public void destroy() {
  14. }
  15. }
  1. 3. 过滤器细节:
  2. 1. web.xml配置
  3. <filter>
  4. <filter-name>demo1</filter-name>
  5. <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>demo1</filter-name>
  9. <!-- 拦截路径 -->
  10. <url-pattern>/*</url-pattern>
  11. </filter-mapping>
  12. 2. 过滤器执行流程
  13. 1. 执行过滤器 doFilter(....)
  14. 2. 放行后( filterChain.doFilter): 执行url 请求的资源,
  15. 例如: url请求servlet,那么就执行 servlet中doXxx() 方法;
  16. 3. 回来执行过滤器放行代码下边的代码
  17. 3. 过滤器生命周期方法
  18. 1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
  19. 2. doFilter:每一次请求被拦截资源时,会执行。执行多次
  20. 3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
  21. 释放资源-导师有话要说: tomcat 关闭后, JVM内存中所有的资源全部会自动的处理,所以一般我们也不会在destroy 方法中去写代码显示的清除init加载的资源
  22. 4. 过滤器配置详解
  23. * 拦截路径配置:
  24. 1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
  25. 2.(重点) 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
  26. 导师有话要说: 这种方式,我们一般用来做权限管理。
  27. 3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
  28. 4.(重点) 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
  29. 导师有话要说: 拦截所有请求,包括我们的 img .css .js .html 静态资源也会被拦截,
  30. 这个事 显得有点没有必要,静态资源不需要进行过滤。
  31. 5. @WebFilter(urlPatterns = {"/updateUserServlet", "/addUserServlet"})
  32. * (了解)拦截方式配置:资源被访问的方式
  33. 导师有话要说--这个事显得没有那么的重要,原因如下:
  34. 1. 项目中使用的Filter 场景其实并不多
  35. 2. 一般企业中的Filter 需求都是对 客户端浏览器发起的请求进行拦击,默认就是该拦截方式。
  36. 3. 企业中一般不会直接使用Filter,一般用企业级框架: Struts SpringMvc 的 intercepter (拦截器)
  37. * 注解配置:
  38. * 设置dispatcherTypes属性
  39. 1. REQUEST:默认值。浏览器直接请求资源
  40. 2. FORWARD:转发访问资源
  41. 3. INCLUDE:包含访问资源
  42. 4. ERROR:错误跳转资源
  43. 5. ASYNC:异步访问资源
  44. * web.xml配置
  45. * 设置<dispatcher></dispatcher>标签即可
  46. 5. 过滤器链(配置多个过滤器)
  47. * 执行顺序:如果有两个过滤器:过滤器1和过滤器2
  48. 1. 过滤器1
  49. 2. 过滤器2
  50. 3. 资源执行
  51. 4. 过滤器2
  52. 5. 过滤器1
  53. * 过滤器先后顺序问题:
  54. 1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
  55. * 按照自然顺序进行比较: 什么自然顺序?1 2 3 4 5.... A B C D E....
  56. * 如: AFilter 和 BFilter,AFilter就先执行了。
  57. 2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行
  58. 一般咱企业里,我们只关心我们配置的多个Filter 是否都执行了,往往不关心谁先谁后。
  59. 4. 案例:
  60. 1. 案例1_登录验证
  61. * 需求:
  62. 1. 访问day17_case案例的资源。验证其是否登录
  63. 2. 如果登录了,则直接放行。
  64. 3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
  1. 2. 案例2_敏感词汇过滤
  2. * 需求:
  3. 1. day17_case案例录入的数据进行敏感词汇过滤
  4. 2. 敏感词汇参考《敏感词汇.txt
  5. 3. 如果是敏感词汇,替换为 ***
  6. * 分析:
  7. 1. request对象进行增强。增强获取参数相关方法
  8. 2. 放行。传递代理对象
  9. * 增强对象的功能:
  10. * 设计模式:一些通用的解决固定问题的方式
  11. 1. 装饰模式
  12. 2. 代理模式
  13. * 概念:
  14. 1. 真实对象:被代理的对象
  15. 2. 代理对象:
  16. 3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
  17. * 实现方式:
  18. 1. 静态代理:有一个类文件描述代理模式
  19. 2. 动态代理:在内存中形成代理类
  20. * 实现步骤:
  21. 1. 代理对象和真实对象实现相同的接口
  22. 2. 代理对象 = Proxy.newProxyInstance();
  23. 3. 使用代理对象调用方法。
  24. 4. 增强方法
  25. * 增强方式:
  26. 1. 增强参数列表
  27. 2. 增强返回值类型
  28. 3. 增强方法体执行逻辑
  29. 导师语录:
  30. 化学反应就是: 执行目标方法之前,我们可以先调用 增强方法,在增强方法中,可以自行通过代码控制 目标 方法是否调用
  31. 作用: 可以降低目标方法的代码冗余度,将公共的 代码逻辑 写到我们增强方法中。
  32. 其他: 我们给 Filter 叫做切面, spring 中叫: aop 就是切面。

Listener:监听器

  1. * 概念:web的三大组件之一。
  2. * 事件监听机制
  3. * 事件 :一件事情
  4. * 事件源 :事件发生的地方
  5. * 监听器 :一个对象
  6. * 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
  7. * ServletContextListener:监听ServletContext对象的创建和销毁
  8. * 方法:
  9. * void contextDestroyed(ServletContextEvent sce) ServletContext对象被销毁之前会调用该方法
  10. * void contextInitialized(ServletContextEvent sce) ServletContext对象创建后会调用该方法
  11. * 步骤:
  12. 1. 定义一个类,实现ServletContextListener接口
  13. 2. 复写方法
  14. 3. 配置
  15. 1. web.xml
  16. <listener>
  17. <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
  18. </listener>
  19. * 指定初始化参数<context-param>
  20. 2. 注解:
  21. * @WebListener