zoukankan      html  css  js  c++  java
  • java web 开发应用 ----过滤器

    过滤器的作用

    1.当用户请求web资源时,如果没有过滤器,用户可以直接获取到这个web资源,当有了过滤器之后,当用户请求web资源时,web容器中的过滤器先会拦截到这个请求,然后根据这个请求 做相应的处理,之后会访问这个请求所对应的资源,这个资源返回给过滤器,再由过滤器返回给用户;过滤器的作用大概就是这样。

    接下来讲一下过滤器的生命周期;

    首先要实例化这个过滤器,实例化的时间是在web.xml 被加载的时候,之后就是初始化这个过滤器,初始化会调用init()方法,目前这两步都只会执行一次,就是当web容器启动的时候,接下来就是过滤,过滤调用doFilter()方法;之后就是销毁阶段,destory()方法,这个方法也是只调用一次,就是在web容器关闭的时候,

    init()这是过滤器的初始化方法,web容器创建过滤器实例后,将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数;

    doFilter()这个方法完成实际的过滤操作,这个地方是过滤器的核心方法,当用户请求访问与过滤器相关联的url时,web容器将先调用过滤器的doFilter方法;

    FileterChain参数可以调用chain.doFiter方法,将请求传给下一个过滤器(或者目标资源),或者利用转发,重定向将请求转发到其他资源,

    destory:web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源

    要使用过滤器要在web.xml配置好这个过滤器

    在web.xml中配置过滤器,除了用编写代码的形式,还可以用myeclipse中design中的快捷方法;选中filter;

    FirstFilter.java

    package com
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class FirstFilter implements Filter {
    
        @Override
        public void destroy() {
            System.out.println("destroy---FirstFilter");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("start----doFilter--FirstFilter");
    //        chain.doFilter(request, response);
            HttpServletRequest req =(HttpServletRequest) request;
            HttpServletResponse response2 =(HttpServletResponse) response;
            //重定向
            response2.sendRedirect(req.getContextPath()+"/main.jsp");
            //转发
    //        req.getRequestDispatcher("main.jsp").forward(request, response);
    //        req.getRequestDispatcher("main.jsp").include(request, response);
            System.out.println("end------doFilter--FirstFilter");
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("init----FirstFilter");
        }
    
    
    }
    View Code

    问题描述:

    1.过滤器能否改变用户请求的web资源呢?也就是说能否改变用户请求的路径呢?(可以)

    2.过滤器能否直接返回数据呢,能不能直接处理用户请求呢?(不行),过滤器不能直接返回的意思是不能直接处理用户请求,也不能直接对客户端生成响应。response对象是HttpServletResponse,已经是访问的Web资源返回的响应数据。过滤器不是一个标准的Servlet,主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理。

    问题:web项目中多个过滤器是如何实现的?多个过滤器对应同一个用户路径执行顺序又是怎么样的?

    在web项目中是允许定义多个过滤器的,如果这些过滤器互不相干,就会形成一条过滤器链,那么这个代码是dofiter里的代码是如何执行的呢?

    服务器会按照web.xml 中过滤器定义的先后顺序组装成一条链,

    SecondFilter.java

    package com
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class SecondFilter implements Filter {
    
        @Override
        public void destroy() {
            System.out.println("destroy-----SecondFilter");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("start---doFilter--SecondFilter");
            chain.doFilter(request, response);
            System.out.println("end---doFilter--SecondFilter");
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
            System.out.println("init-----SecondFilter");
        }
    
    }
    View Code

    它会依次先执行过滤器链的各个过滤器的放行前的代码,然后在执行web资源代码,然后再依次倒着执行过滤器链的各个过滤器的放行后的代码。

    2.过滤器的分类;

    struts的拦截器:

    过滤器分成四类:request。(通过访问请求)。forward。include。error。

    先在自己项目中。搭建struts2的运行环境,引入jar包。,写web.xml配置。定义struts2过滤器;这样以后struts的结果就有了。然后写一个类,继承ActionSupport类,这个类有个方法一个要写execute方法;这个方法返回的String,将在struts.xml 中返回相应的路径;返回成功的字符串;

    实现步骤:(一)再次创建一个类;继承ActionSupport类或者实现Interceptor接口;只需要实现intercept方法即可;

    方式一:实现Interceptor接口;

    void init():初始化拦截器所需资源;

    void destory(); 释放在init()中分配的资源;

    String intercept(ActionInvocation ai) thows Exception

    实现拦截器功能;

    利用ActionInvocation 参数获取Action 状态;

    返回result字符串作为逻辑视图:

    在struts2中提供了一个父类,AbstractInterceptor类;

    提供了init()和destory()方法实现空实现;

    只需要实现intercept方法即可;

    在调用action之前,会一次调用所配置的拦截器;当把这些拦截器执行完之后才会调用action。然后执行完action之后,又会反向的依次执行拦截器;才会通过最重的请求的响应;

    写完类之后就要去struts.xml 配置了

    <!-- 注册拦截器-->
    <interceptors>
        <interceptor name="mytimer" class="" ></interceptor>
    </interceptors>
    <action name="timer class="">
           <result>/success.jsp</result>
           <!-- 引用拦截器-->
           <interceptor-ref name="mytimer"></interceptor-ref>
    </action>

    配置过程也分为两步;首先要先注册这个拦截器,然后在相应的action中,调用这个拦截器; 

    struts内建拦截器;

    params 拦截器;

    负责将请求参数设置为Action属性;

    staticParams 拦截器;

    将配置文件中action元素的子元素param参数设置为Action属性;

    fileUpload拦截器

    对文件上传提供支持,将文件和元数据设置到对应的Action属性;

  • 相关阅读:
    iOS
    流媒体服务之基于RTMP的本地Nginx服务器和VLC安装
    iOS-搭建基于RTMP的本地Nginx服务器(VLC播放器免费安装)+ 推流LFLiveKit直播框架集成 + ijkplayer拉流框架编译集成
    hexo主题next 7.X版本配置美化
    Centos记录所有用户登录和操作的详细日志
    二进制搭建kubernetes多master集群【四、配置k8s node】
    二进制搭建kubernetes多master集群【三、配置k8s master及高可用】
    二进制搭建kubernetes多master集群【二、配置flannel网络】
    二进制搭建kubernetes多master集群【一、使用TLS证书搭建etcd集群】
    二进制搭建kubernetes多master集群【开篇、集群环境和功能介绍】
  • 原文地址:https://www.cnblogs.com/zht0915/p/4729385.html
Copyright © 2011-2022 走看看