在开发中遇到一个场景,当需要提供接口给其他系统,并需要鉴权时,我当时的处理方案是用过滤器拦截进行个性化鉴权,如果鉴权通过则还是需要经过安全测试、转码等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 Web开发中,过滤器(Filter)是一种用于拦截请求和响应的重要机制,可以实现对用户请求的预处理和后处理,以及对响应的处理。本文将深入解析“JAVA过滤器标准代码”,探讨...
总结来说,过滤器链是Java Web开发中一种强大的工具,它允许开发者灵活地控制请求和响应的处理流程,提高代码复用性,降低系统复杂性。通过"FilterChainDemo"这样的实践案例,我们可以深入理解过滤器链的工作原理,...
Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。在ACCP课程中,这个“accp java过滤器 PPT”很可能是为了帮助学习者深入理解如何在Web应用程序中有效地使用...
当用户向Web应用发送请求时,Servlet容器会按照过滤器链的顺序依次调用每个过滤器的doFilter方法。在这个方法中,开发者可以实现预处理或后处理逻辑。doFilter方法通常会调用Chain of Responsibility设计模式,通过...
Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。过滤器允许我们在请求被发送到目标资源(如Servlet、JSP页面)之前或之后进行预处理和后处理。在这个场景中,...
### Java过滤器实现原理与应用...通过以上内容可以看出,Java过滤器是一个非常强大且灵活的工具,可以帮助开发者在不修改业务逻辑的情况下实现各种功能。无论是对于提高系统的安全性还是改善用户体验,都有重要的意义。
Java过滤器,全称为Servlet Filter,在Java Web开发中扮演着重要的角色。它是Java Servlet API的一部分,主要用于在HTTP请求被实际处理之前或者之后进行拦截、修改或增强。通过使用过滤器,开发者可以实现诸如数据...
Java过滤器(Filter)是Java Web开发中的一个重要概念,它主要应用于Servlet容器中,如Tomcat、Jetty等。过滤器允许我们在请求被处理之前或之后进行预处理和后处理,以此来拦截、修改或者增强请求和响应。在这个简单...
总之,过滤器链是Java Web开发中的重要工具,它提供了一种灵活的方式来增强应用程序的功能,而无需修改目标资源的代码。通过理解并熟练运用过滤器链,开发者可以更高效地管理和维护复杂的Web应用程序。本例中的"过滤...
6. **配置过滤器**:在`web.xml`文件中配置过滤器,指定其过滤范围、初始化参数以及过滤器链的顺序。 7. **Filter的性能优化**:合理设计过滤器链和优化过滤器的处理效率是提高系统性能的关键。避免过度的内存消耗...
此外,过滤器链的概念使得可以有多个过滤器串联起来,每个过滤器执行特定的任务,这有助于保持代码的模块化和可维护性。 在实际应用中,过滤器的配置通常在`web.xml`部署描述符中完成,通过`<filter>`和`...
1. 链式调用:多个过滤器可以串联,形成一个过滤器链。请求会按照`<filter-mapping>`的顺序依次通过每个过滤器。 2. 无侵入性:过滤器不会改变原有Servlet代码,使得业务逻辑和控制逻辑分离,提高了代码的可维护性...
Java过滤器是Servlet技术中的一项强大工具,能够帮助开发者在不直接修改目标资源代码的前提下增强其功能。通过合理的配置和设计,过滤器可以在不增加复杂性的情况下提高Web应用程序的安全性和灵活性。理解并掌握过滤...
在Java编程领域,过滤器(Filters)是一种常用的设计模式,用于处理数据流或请求响应链中的特定任务。根据所提供的标题、描述以及部分模糊的内容,我们可以深入探讨Java中一些常用的过滤器类型及其应用。 ### 1. ...
通过配置过滤器,开发者可以在不修改任何现有代码的情况下增强应用程序的功能。本篇文章将围绕“Java自定义过滤器”这一主题展开,详细介绍自定义过滤器的设计与实现。 #### 二、基本概念 1. **过滤器接口**:`...
### 六个有用的Java过滤器知识点详解 在Java Web开发中,过滤器(Filter)是一种非常重要的技术,它能够对用户的请求和响应进行预处理或后处理,从而实现各种功能需求,例如设置缓存策略、登录验证、字符编码转换等...
3. **过滤器链**:多个过滤器可以串联形成过滤器链,按照配置的顺序依次执行。每个过滤器的`doFilter()`方法会调用`chain.doFilter(request, response)`,将请求传递给下一个过滤器,直到达到目标Servlet。 现在,...
* FilterChain 接口:FilterChain 接口是 Java 中的一种过滤器链接口,用于将多个过滤器连接起来,以便实现链式调用。它提供了一个 doFilter() 方法,用于执行下一个过滤器。 二、自定义编码过滤器 在上面的代码中...
在Java中,消息过滤器的实现主要涉及到I/O流、网络编程以及过滤器链的概念。 首先,我们需要理解Java I/O流的基本概念。Java的I/O流允许程序读取和写入数据到各种输入和输出源,如文件、网络连接或者内存缓冲区。I/...
当客户端发起请求时,服务器会根据`web.xml`或Java配置文件中的过滤器链顺序调用这些过滤器。每个过滤器在请求到达目标Servlet之前有机会对请求进行处理,并在响应返回给客户端之前有机会对响应进行处理。过滤器之间...