zoukankan      html  css  js  c++  java
  • (Filter + Listener )Day18

    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:局部变量上可以使用
     
    通过反射的方式进行获取(了解)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Python基础学习
    My First Bog
    WPF 自定义窗口,自定义控件和样式
    WPF 数据规则验证
    C# 类的扩展方法
    C# 类的序列化和反序列化
    数据库使用空间查询方法
    关于linux环境下django获取中文url报错处理
    Django中关于csrf_token的认证
    Django + Uwsgi + Nginx 的生产环境部署
  • 原文地址:https://www.cnblogs.com/ZhuX-H/p/13442395.html
Copyright © 2011-2022 走看看