Filter过滤器

  filter是对客户端访问资源的过滤,符合条件的放行,不符合的不放行,并且可以对目标资源访问前后进行逻辑处理。

设置步骤

  1. 创建类实现Filter接口
  2. 在 doFilter 方法中编写放行和拦截的代码
  3. 在 web.xml 文件中进行配置
  4. <filter>
    <display-name>UserFilter</display-name>
    <filter-name>UserFilter</filter-name>
    <filter-class>com.zhiyou100.filter.UserFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>UserFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <servlet-name>MyServlet01</servlet-name>
    </filter-mapping>
  5. 对于<url-pattener> /* </url-pattener>  将路径配置为  /*  就是拦截所有的请求
  6. 也可以配置<servlet-name> MyServlet  </servlet-name> 表示指拦截指定的servlet
  7. url-pattener  和   servlet-name  可以同时配置多个
  8. <filter-mapping>
    <filter-name>UserFilter</filter-name>
    <servlet-name>MyServlet01</servlet-name>
    <servlet-name>MyServlet02</servlet-name>
    <url-pattern>*.do</url-pattern> <url-pattern>*.action</url-pattern> </filter-mapping>

url­pattern

  1. 完全匹配  /servlet ,也可以使用<servlet-name> servlet </servlet-name>
  2. 目录匹配 
    • /aaa/bbb/*  使用情况较多
    • /user/*     访问前台的资源进入此过滤器
    • /admin/*  访问后台的资源执行此过滤器
  3. 扩展名匹配  *.adc  *.jsp    *.action
  4. /* 拦截所有,包括静态资源和jsp页面
  5. 目录匹配和扩展名匹配不能同时使用,会造成服务器无法正常启动
  6. 如果有多个filter ,按照web.xml 中 <filter-mapping> 标签前后顺序进行过滤,并不依照<filter>的前后顺序

dispatcher:访问的方式(了解)

  1. REQUEST :默认值,代表直接访问某个资源执行的filter
  2. FORWARD: 转发时才执行filter
  3. INCLUDE : 包含资源时执行 filter
  4. ERROR :发生错误时进行跳是执行filter

生命周期

  • 服务器启动到时候  init 方法调用,  filter  被创建
  • 服务器关闭的时候destory方法调用,filter被销毁
  • 当有请求过来并符合拦截规则的时候  dofilter 方法执行

应用

  • 权限限制

    • 实例:用户不登陆不允许访问浏览器其他内容
    •  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
      throws ServletException, IOException {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse res = (HttpServletResponse) response;
      User u = (User) req.getSession().getAttribute("user");
      String path = req.getServletPath();
      if (path.equals("/index.jsp") || path.equals("/login")) {
      chain.doFilter(request, response);
      return;
      }
      if (u == null) {
      res.sendRedirect(req.getContextPath() + "/index.jsp");
      return;
      }
      chain.doFilter(request, response);
      }
      }
  • 全局编码

    • 设置  request,response  的编码格式
    • tomcat内置编码过滤器设置

    • 自动登录过滤器

Listener监听器

  监听器就是监听某个对象的的状态变化的组件,其主要是监听三个域对象(ServletContext 域,HttpSession域,ServletRequest域)的创建和销毁以及域对象内的属性的改变,一共有6+2个

ServletContextListener

  监听ServletContext域的创建和销毁

  • 设置步骤

    • 写一个监听器类去实现监听器接口
    • 覆盖接口方法
    • 在web.xml中进行配置
  • 应用范围

    • 加载配置文件,spring中加载配置文件使用

HttpSessionListener

  监听session的创建和销毁

  • 应用范围

    • 统计网站的访问数量

对象放在session中一共有四种状态

  • 1.  绑定状态:就一个对象被放到session域中
  • 2.  解绑状态:就是这个对象从session域中移除了
  • 3.  钝化状态:是将session内存中的对象持久化(序列化)到磁盘
  • 4.  活化状态:就是将磁盘上的对象再次恢复到session内存中

session中的绑定的对象相关的监听器(对象感知监听器)

  • 绑定与解绑的监听器HttpSessionBindingListener

    • 此接口是需要对象去实现,并且不需要去注册
  • 钝化与活化的监听器HttpSessionActivationListener

    • 实质上就是session中对象的序列化和反序列化,可用于服务器的优化,所以需要将放在session 中的对象实现此接口,如果需要对象存在磁盘中,需要当前类实现Serializable接口
    • 服务器的优化处理

      • 通过一个xml文件进行配置session中的对象多久被钝化
        在META­INF中创建一个名字为context.xml文件 将下面代码拷贝进文件

注解

  注解Annotation是一种属于代码级别的说明,是一种具有功能的说明.是从jdk1.5版 本以后添加的新特性,其格式为@注解名称.对比注释而言,注释是写给人看的,是没有功能的文字. 注解是写个JVM看的,具有功能的代码

注解的作用

在目前的主流应用在替代配置文件

  • 对比servlet2.5,Servlet3.0新加了很多的新特性,其中就有提供了注解的支持,也就是不需要使用 web.xml可以进行路径的配置
  • 优点:开发效率高
  • 确定:耦合性太强,不便于维护

常见注解

  @Override:告知编译器此方法是覆盖父类的

  @Deprecated:标注过时

  @SuppressWarnings:压制警告

自定义注解(了解)

  • 使用关键字@interface表示注解
  • 注解中定义的属性格式为修饰符 数据类型 属性名称() default 具体的值;
    • 修饰符只能是public abstract,和接口相同会默认添加
    • 数据类型可以是:基本类型,String,枚举类型,注解类型,Class类型,以上类型的一维数组类型
  • default是默认值可以不写,如果不写在使用注解的时候就必须进行设置,如果有默认值就可以 不用进行设置
  • 注意:如果属性的名字是value,并且注解的属性设置的时候只需设置这一个 那么在使用注解时 可以省略value

使用注解(掌握)

  在类,方法,字段 上面是@注解名称(属性名=属性值,属性名=属性值)  

元注解

  可以认为是注解的注解

@Retention  注解的可见范围
  • SOURCE: 注解在源码级别可见(默认是source级别)
  • CLASS:注解在字节码文件级别和源码级别可见
  • RUNTIME:注解在整个运行阶段以及之前的两个级别都可见
  • 注意:要想解析使用了注解的类 , 那么该注解的Retention必须设置成Runtime
@Target  注解修饰的范围:类上使用,方法上使用,字段上使用
  • FIELD:字段上可用此注解 METHOD:方法上可以用此注解
  • TYPE:类/接口上可以使用此注解
  • PARAMETER:参数上可以使用
  • CONSTRUCTOR:构造函数上可以使用
  • LOCAL_VARIABLE:局部变量上可以使用
 
通过反射的方式进行获取(了解)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

最新文章

  1. JS总结 节点
  2. hbase基础-系统架构
  3. Ms - Sql 定位附近的人
  4. 字节流InputStream/OutputStream
  5. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
  6. php模式设计之 工厂模式
  7. vsftp搭配iptables的配置
  8. How to get cocoapods work on Yosemite
  9. Spring 3 MVC and JSON example
  10. 九度OJ 1480 最大上升子序列和 -- 动态规划
  11. Logstash 默认不处理一天前的文件
  12. ie 64bit调用activex控件
  13. BMP图片格式模型(2)
  14. ArrayList 如何完美去除空值
  15. js实现谷歌网站统计
  16. fgets的用法
  17. 飞旋treap
  18. mysql 8.0 错误The server requested authentication method unknown to the client
  19. Python3基础 else 循环完整结束才执行
  20. python mysql connector

热门文章

  1. Ethical Hacking - NETWORK PENETRATION TESTING(9)
  2. T3 难题 题解
  3. HDU - 1520 Anniversary party (树的最大独立集)
  4. 中介者模式(c++实现)
  5. 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文
  6. Java中解决继承和接口默认方法冲突
  7. Docker 入门教程(4)——docker-compse 服务编排
  8. Java环境变量设置:Path、CLASSPATH、JAVA_HOME的作用分别是什么?
  9. control+B进入layout文件的xml文本编辑模式
  10. ES搜索引擎-一篇文章就够了