`
征途2010
  • 浏览: 247603 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何修改java过滤器链

    博客分类:
  • java
阅读更多

在开发中遇到一个场景,当需要提供接口给其他系统,并需要鉴权时,我当时的处理方案是用过滤器拦截进行个性化鉴权,如果鉴权通过则还是需要经过安全测试、转码等filter,但是不走后面的鉴权过滤器,不通过则跳转到错误页面。

这里就需要去掉过滤器链中的某一个过滤器,下面介绍下我的方案:通过反射修改过滤器链:

 /**
     * 
     * 通过反射修改过滤器链
     * @param chain   
     */
    private void skipFilter(FilterChain chain) {
        try {
            //排除的过滤器数组
            Object[] filterArr=new Object[]{InterfaceConstants.UN_AUTH_FILTER};
            Field field = chain.getClass().getDeclaredField("filters");
            field.setAccessible(true);
            FilterConfig[] filters = (FilterConfig[]) field.get(chain);
            int k = 0;
            for (int i = 0; i < filters.length; i++) {
                if (filters[i] != null) {
                    Field field2 = filters[i].getClass().getDeclaredField("filterDef");
                    field2.setAccessible(true);
                    Field field3 = field2.get(filters[i]).getClass().getDeclaredField("filterClass");
                    field3.setAccessible(true);
                    String filterClass = (String) field3.get(field2.get(filters[i]));
                    int loc = Arrays.binarySearch(filterArr, filterClass);
                    if (loc >= 0) {
                        //将过滤器重置为null
                        filters[i] = null;
                        k++;
                    }
                    field3.setAccessible(false);
                    field2.setAccessible(false);
                }
            }
            int index = 0;
            for (int i = 0; i < filters.length; i++) {
                if (index == 0 && filters[i] == null) {
                    index = i;
                } else if (index != 0 && filters[i] != null) {
                    filters[index] = filters[i];
                    filters[i] = null;
                    i = index;
                    index = 0;
                }
            }
            field.setAccessible(false);
            Field n=null;
            try {
                n = chain.getClass().getDeclaredField("n");
                logger.info("tomcat容器中filter的n属性");
            } catch (Exception e) {
                n = chain.getClass().getDeclaredField("filterCount");
                logger.info("jboss容器中filterCount属性");
            }
            if(n!=null){
                n.setAccessible(true);
                n.set(chain, n.getInt(chain) - k);
                n.setAccessible(false);
            }
        } catch (Exception e) {
            logger.error("通过反射修改过滤器链出错",e);
        }
        
    }

 

分享到:
评论

相关推荐

    JAVA过滤器标准代码

    ### JAVA过滤器标准代码解析与应用 在Java Web开发中,过滤器(Filter)是一种用于拦截请求和响应的重要机制,可以实现对用户请求的预处理和后处理,以及对响应的处理。本文将深入解析“JAVA过滤器标准代码”,探讨...

    过滤器链的一个小Demo

    总结来说,过滤器链是Java Web开发中一种强大的工具,它允许开发者灵活地控制请求和响应的处理流程,提高代码复用性,降低系统复杂性。通过"FilterChainDemo"这样的实践案例,我们可以深入理解过滤器链的工作原理,...

    accp java过滤器 PPT

    Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。在ACCP课程中,这个“accp java过滤器 PPT”很可能是为了帮助学习者深入理解如何在Web应用程序中有效地使用...

    JAVA过滤器及原理

    当用户向Web应用发送请求时,Servlet容器会按照过滤器链的顺序依次调用每个过滤器的doFilter方法。在这个方法中,开发者可以实现预处理或后处理逻辑。doFilter方法通常会调用Chain of Responsibility设计模式,通过...

    java过滤器的使用

    Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。过滤器允许我们在请求被发送到目标资源(如Servlet、JSP页面)之前或之后进行预处理和后处理。在这个场景中,...

    java过滤器

    ### Java过滤器实现原理与应用...通过以上内容可以看出,Java过滤器是一个非常强大且灵活的工具,可以帮助开发者在不修改业务逻辑的情况下实现各种功能。无论是对于提高系统的安全性还是改善用户体验,都有重要的意义。

    java过滤器例子

    Java过滤器,全称为Servlet Filter,在Java Web开发中扮演着重要的角色。它是Java Servlet API的一部分,主要用于在HTTP请求被实际处理之前或者之后进行拦截、修改或增强。通过使用过滤器,开发者可以实现诸如数据...

    java过滤器简单实例

    Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。过滤器允许我们在请求被处理之前或之后进行预处理和后处理,以此来拦截、修改或者增强请求和响应。在这个简单...

    网络编程 过滤器链例子

    总之,过滤器链是Java Web开发中的重要工具,它提供了一种灵活的方式来增强应用程序的功能,而无需修改目标资源的代码。通过理解并熟练运用过滤器链,开发者可以更高效地管理和维护复杂的Web应用程序。本例中的"过滤...

    管道过滤器程序,主要用java实现

    6. **配置过滤器**:在`web.xml`文件中配置过滤器,指定其过滤范围、初始化参数以及过滤器链的顺序。 7. **Filter的性能优化**:合理设计过滤器链和优化过滤器的处理效率是提高系统性能的关键。避免过度的内存消耗...

    java的过滤器

    此外,过滤器链的概念使得可以有多个过滤器串联起来,每个过滤器执行特定的任务,这有助于保持代码的模块化和可维护性。 在实际应用中,过滤器的配置通常在`web.xml`部署描述符中完成,通过`&lt;filter&gt;`和`...

    Java过滤器及其特性

    1. 链式调用:多个过滤器可以串联,形成一个过滤器链。请求会按照`&lt;filter-mapping&gt;`的顺序依次通过每个过滤器。 2. 无侵入性:过滤器不会改变原有Servlet代码,使得业务逻辑和控制逻辑分离,提高了代码的可维护性...

    java_过滤器详解

    Java过滤器是Servlet技术中的一项强大工具,能够帮助开发者在不直接修改目标资源代码的前提下增强其功能。通过合理的配置和设计,过滤器可以在不增加复杂性的情况下提高Web应用程序的安全性和灵活性。理解并掌握过滤...

    java一些 常用 的过滤 器

    在Java编程领域,过滤器(Filters)是一种常用的设计模式,用于处理数据流或请求响应链中的特定任务。根据所提供的标题、描述以及部分模糊的内容,我们可以深入探讨Java中一些常用的过滤器类型及其应用。 ### 1. ...

    Java自定义过滤器

    通过配置过滤器,开发者可以在不修改任何现有代码的情况下增强应用程序的功能。本篇文章将围绕“Java自定义过滤器”这一主题展开,详细介绍自定义过滤器的设计与实现。 #### 二、基本概念 1. **过滤器接口**:`...

    六个有用的java过滤器

    ### 六个有用的Java过滤器知识点详解 在Java Web开发中,过滤器(Filter)是一种非常重要的技术,它能够对用户的请求和响应进行预处理或后处理,从而实现各种功能需求,例如设置缓存策略、登录验证、字符编码转换等...

    Java中过滤器的使用

    3. **过滤器链**:多个过滤器可以串联形成过滤器链,按照配置的顺序依次执行。每个过滤器的`doFilter()`方法会调用`chain.doFilter(request, response)`,将请求传递给下一个过滤器,直到达到目标Servlet。 现在,...

    javaFilter自定义编码过滤器

    * FilterChain 接口:FilterChain 接口是 Java 中的一种过滤器链接口,用于将多个过滤器连接起来,以便实现链式调用。它提供了一个 doFilter() 方法,用于执行下一个过滤器。 二、自定义编码过滤器 在上面的代码中...

    java 消息过滤器的实现

    在Java中,消息过滤器的实现主要涉及到I/O流、网络编程以及过滤器链的概念。 首先,我们需要理解Java I/O流的基本概念。Java的I/O流允许程序读取和写入数据到各种输入和输出源,如文件、网络连接或者内存缓冲区。I/...

    javaServlet过滤器

    当客户端发起请求时,服务器会根据`web.xml`或Java配置文件中的过滤器链顺序调用这些过滤器。每个过滤器在请求到达目标Servlet之前有机会对请求进行处理,并在响应返回给客户端之前有机会对响应进行处理。过滤器之间...

Global site tag (gtag.js) - Google Analytics