zoukankan      html  css  js  c++  java
  • 二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别

    1、Servlet:运行在服务器上可以动态生成web页面。servlet的声明周期从被装入到web服务器内存,到服务器关闭结束。一般启动web服务器时会加载servelt的实例进行装入,然后初始化工作init(),调用doPost()和doGet()方法。然后调用destroy()方法进行销毁实例。

    2、Filter:必须实现Filter的接口(javax.servlet.Filter),有点类似servlet的过程,也是启动服务器的时候加载过滤器的实例,然后调用初始化方法init()来初始化实例,每一次请求都之调用doFilter()方法进行处理,停止服务器后,会调用destroy()方法进行销毁实例。过滤器用于过滤掉非法的URL请求。过滤器是基于函数回调,依赖于Servlet容器。

    /*过滤器*/
    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.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class TestFilter extends HttpServlet implements Filter{
        //销毁方法
        public void destroy(){
            System.out.println("销毁方法执行---");
        }
        
        public void doFilter(ServletRequest args1,ServletResponse args2,FilterChain filterChain) throws IOException,ServletException{
            HttpServletRequest request=(HttpServletRequest)args1;
            HttpServletResponse response=(HttpServletResponse)args2;
            requestCharacterEncoding("UTF-8");
            //继续转发请求,必须有
            filterChain.doFilter(request,response);
        }
        
        public void init(FilterConfig args1) throws ServletException{
            System.out.println("初始化方法执行---");
        }
    }

    在web.xml中的配置:

    <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.demo.filter.TestFilter</fiter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    3、Listener:主要是用来进行监听web服务器中的一个执行动作,也是随着web服务器的启动而启动,只初始化一次,随着web服务器的停止而销毁。

    /*监听器*/
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    public class TestListener implements ServletContextListener{
        public void destroy(ServletContextEvent args){
        //在web应用销毁之前调用
            System.out.println("销毁方法执行---")
        }
        
        public void init(ServletContextEvent args){
        //初始化一个对象,然后赋值
            Product product=new Product();
            proudct.setName("Apple");
            product.setId(2);
            product.setPrice(2.5);
            
            //将对象存到容器中
            ServletContext sc=args.getServletContext();
            sc.setAttribute("product",product);
            
            //在web应用的其他地方都可以通过这条代码得到product对象
            Product product=(Product)request.getSession().getServletContext().getAttribute("product");
            System.out.println("初始化---");
        }
    }

    在web.xml中的配置:

    <listener>
        <listener-class>com.demo.listener.TestListener</listener-class>
    </listener>

    servlet,filter,listener都是配置到web.xml上的,Structs2中的拦截器interceptor配置到structs.xml上,spring的拦截器配置在spring-servlet.xml中。

    4、Interceptor:拦截器类似Filter,也是拦截用户的请求,不是随着web应用的启动而启动,只有调用相应的方法才会调用。比如进行权限验证,或者来判断用户是否登录,日志记录,或者限制时间点访问。应用在面向切面编程AOP。拦截器是基于java反射机制,不依赖Servlet容器

    拦截器只能对structs中的Action,spring中的service起作用。过滤器几乎对所有请求都起作用。

    在action的生命周期中,拦截器可以被调用多次,而过滤器只能在容器初始化的时候被调用一次。

    structs2中拦截器的实现:

    1、继承AbstractInterceptor类

    2、实现Interceptor接口

    3、继承MethodFilterInterceptor类

    在structs.xml中配置拦截器。

    <!-- 配置拦截器 -->
    <interceptors>
    <!-- 配置自定义拦截器 -->
    <interceptor name="TestInterceptor" class="com.demo.interceptor.TestInterceptor"></interceptor>
    <!-- 配置拦截器栈 -->
    <interceptor-stack name="TestStack">
    <interceptor-ref name="defaultStack"/><!-- 加载默认拦截器 -->
    <!-- 加载自定义拦截器 -->
    <interceptor-ref name="TestInterceptor">
    <!-- 配置要拦截的方法;user,client为方法名 -->
    <param name="includeMethods">user,client</param>
    <!-- 配置不需要拦截的方法;login为方法名 -->
    <param name="excludeMethods">login</param>
    </interceptor-ref>
    </interceptor-stack>
    </interceptors>
    public class TestInterceptor extends AbstractInterceptor {
    //这个是需要用到的自定义的方法。
    private GroupPowerService groupPowerService;
    public String intercept(ActionInvocation invocation) throws Exception {
                 Map map= invocation.getInvocationContext().getSession();
                 if (map.get("user")==null){
                    return "noLogin";
     }
    else{
                //得到用户的权限id 和 访问的类名
                int id = ((User)map.get("user")).getGroupId();
                //拦截的action的名字
                String action = invocation.getInvocationContext().getName();
                //通过用户id 和拦截的action名判断用户是否有这个权限 
                if(this.groupPowerService.hasPower(id,action))
                 //继续执行 不拦截
                return invocation.invoke();
                return "noPower";
            }
        }
        public GroupPowerService getGroupPowerService() {
        return groupPowerService;
    }
  • 相关阅读:
    DOM(文档对象模型)
    客户端检测
    mysql之触发器
    mysql之select(二)
    浅谈mysql中varchar(m)与char(n)的区别与联系
    mysql之select(一)
    mysql(一)
    mysql5.7.11安装遇到的问题
    Java 网络编程(二)
    Java 网络编程(一)
  • 原文地址:https://www.cnblogs.com/drq1/p/8603442.html
Copyright © 2011-2022 走看看