过滤器过滤特定的url_如何从过滤器中排除URL

过滤器过滤特定的url

默认情况下,过滤器不支持排除特定的URL模式,每当您为过滤器定义URL模式时,任何与该模式匹配的请求都将由过滤器无例外处理。

从过滤器中排除URL的最简单方法是将过滤器映射到非常特定的模式。 在早期开发阶段完成此操作是可行的,但是如果您在生产环境中修改现有过滤器的URL模式,则可能是一个繁琐的过程,因为您必须重新映射所有现有servlet URL以实现您的目的。

在本教程中,我们将展示如何以编程方式向现有过滤器添加排除功能。

1-自定义过滤器

自定义过滤器是您可以控制的过滤器。 即您拥有修改其源代码的所有权利。

假设我们有一个现有的Web应用程序,该应用程序通过LDAP验证用户请求。 所有servlet请求都通过LDAPAuthenticationFilter传递,该映射映射到/ * ,如下所示:

<filter><filter-name>LDAPAuthenticationFilter</filter-name><filter-class>com.programmer.gate.filters.LDAPAuthenticationFilter</filter-class>
</filter>
<filter-mapping><filter-name>LDAPAuthenticationFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

我们的过滤器仅对请求进行身份验证,然后调用chain.doFilter()

LDAPAuthenticationFilter.java

package com.programmer.gate.filters;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;public class LDAPAuthenticationFilter implements Filter{public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {// Authenticate the request through LDAPSystem.out.println("Authenticating the request through LDAP");// Forward the request to the next filter or servlet in the chain.chain.doFilter(req, resp);}public void init(FilterConfig filterConfig) throws ServletException {}public void destroy() {// TODO Auto-generated method stub}
}

现在,假设我们要创建一个servlet,它需要简单的数据库身份验证并且不需要通过LDAP。 我们首先想到的是创建一个新的过滤器,并将其映射到新servlet的特定URL模式。

因此,我们创建了一个名为DatabaseAuthenticationFilter的新过滤器,该过滤器仅通过数据库对请求进行身份验证并随后调用chain.doFilter()

package com.programmer.gate.filters;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 DatabaseAuthenticationFilter implements Filter{public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {// Authenticate the request through database then forward the request to the next filter or servlet in the chainSystem.out.println("Authenticating the request through database");chain.doFilter(req, resp);}public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}public void destroy() {// TODO Auto-generated method stub}
}

我们在web.xml下定义过滤器,以仅处理以/ DatabaseAuthenticatedServlet开头的特定URL:

<filter><filter-name>DatabaseAuthenticationFilter</filter-name><filter-class>com.programmer.gate.filters.DatabaseAuthenticationFilter</filter-class>
</filter>
<filter-mapping><filter-name>DatabaseAuthenticationFilter</filter-name><url-pattern>/DatabaseAuthenticatedServlet/*</url-pattern>
</filter-mapping>

这里的问题是,像/ DatabaseAuthenticatedServlet之类的请求也将匹配根URL模式“ / *”,即我们的请求将通过两个身份验证过程: LDAPDatabase,其排序取决于首先在web.xml下定义哪个过滤器。

为了解决此问题,我们需要修改LDAPAuthenticationFilter ,以排除以/ DatabaseAuthenticatedServlet开头的URL 人们通常要做的是在doFilter()方法中静态检查请求的servlet URL,并在找到时简单地绕过身份验证过程。

在这里,我们进一步走了一步,实现了一个更加动态的解决方案,该解决方案使我们能够通过web.xml管理排除的URL。

以下是将排除功能添加到LDAPAuthenticationFilter的步骤:

  • 添加名为List <String>类型的名为excludeUrls的新字段:
    private List excludedUrls;
  • 里面的init()方法,读取配置属性使用一个FilterConfig称为excludedUrls,属性应该是逗号分隔,使我们排除尽可能多的网址,因为我们需要。
    public void init(FilterConfig filterConfig) throws ServletException {String excludePattern = filterConfig.getInitParameter("excludedUrls");excludedUrls = Arrays.asList(excludePattern.split(","));
    }
  • 修改doFilter()以便检查请求的URL是否属于预定义的排除URL列表,如果是,则只需将请求转发到链中的下一个过滤器或Servlet,否则执行身份验证逻辑。
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {String path = ((HttpServletRequest) req).getServletPath();if(!excludedUrls.contains(path)){// Authenticate the request through LDAPSystem.out.println("Authenticating the request through LDAP");}// Forward the request to the next filter or servlet in the chain.chain.doFilter(req, resp);
    }
  • 现在在web.xml内部,您可以控制从LDAP身份验证中排除的URL,而无需任何代码更改:
    <filter><filter-name>LDAPAuthenticationFilter</filter-name><filter-class>com.programmer.gate.filters.LDAPAuthenticationFilter</filter-class><init-param><param-name>excludedUrls</param-name><!-- Comma separated list of excluded servlets  --><param-value>/DatabaseAuthenticatedServlet,/UnAuthenticatedServlet</param-value></init-param>
    </filter>

添加排除功能后, LDAPAuthenticationFilter如下所示:

package com.programmer.gate.filters;import java.io.IOException;
import java.util.Arrays;
import java.util.List;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;public class LDAPAuthenticationFilter implements Filter{private List excludedUrls;public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {String path = ((HttpServletRequest) req).getServletPath();if(!excludedUrls.contains(path)){// Authenticate the request through LDAPSystem.out.println("Authenticating the request through LDAP");}// Forward the request to the next filter or servlet in the chain.chain.doFilter(req, resp);}public void init(FilterConfig filterConfig) throws ServletException {String excludePattern = filterConfig.getInitParameter("excludedUrls");excludedUrls = Arrays.asList(excludePattern.split(","));}public void destroy() {// TODO Auto-generated method stub}
}

2-第三方过滤器

第三方过滤器是您无法控制的过滤器。 即您不能修改其源代码。

在本节中,我们将对示例进行一些更改,并使用CAS身份验证而不是LDAP。 这就是我们在web.xml中定义CAS身份验证过滤器的方式:

<filter><filter-name>CAS Authentication Filter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>https://localhost:8443/cas/login</param-value></init-param><init-param><param-name>serverName</param-name><param-value>localhost</param-value></init-param>
</filter>
<filter-mapping><filter-name>CAS Authentication Filter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

CAS身份验证是通过第三方库完成的,现在为了支持数据库身份验证,我们无法像在上一个LDAP示例中那样修改CAS的源代码。

从第三方过滤器中排除URL的解决方案是用一个新的自定义过滤器对其进行包装,该过滤器仅添加了exclude功能并将过滤器逻辑委托给包装的类。

以下是将排除功能添加到CAS身份验证的步骤:

  • 创建一个名为CASCustomAuthenticationFilter的新过滤器,如下所示:
    public class CASCustomAuthenticationFilter implements Filter{private AuthenticationFilter casAuthenticationFilter = new AuthenticationFilter();private List excludedUrls;public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {String path = ((HttpServletRequest) req).getServletPath();if(!excludedUrls.contains(path)){// Authenticate the request through CAScasAuthenticationFilter.doFilter(req,resp,chain);}// Forward the request to the next filter or servlet in the chain.chain.doFilter(req, resp);}public void init(FilterConfig arg0) throws ServletException {String excludePattern = filterConfig.getInitParameter("excludedUrls");excludedUrls = Arrays.asList(excludePattern.split(","));casAuthenticationFilter.init();}public void destroy() {casAuthenticationFilter.destroy();}
    }

    我们的自定义过滤器通过构成将CAS验证过滤器包装起来,它的主要目的是仅管理要通过CAS验证的URL,而我们没有涉及CAS验证过程。

  • web.xml中 ,我们将过滤器定义更改为使用CASCustomAuthenticationFilter而不是默认的CAS实现:
    <filter><filter-name>CAS Authentication Filter</filter-name><filter-class>com.programmer.gate.filters.CASCustomAuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>https:localhost:8443/cas/login</param-value></init-param><init-param><param-name>serverName</param-name><param-value>localhost</param-value></init-param><init-param><param-name>excludeUrls</param-name><param-value>/DatabaseAuthenticatedServlet</param-value></init-param>
    </filter>
    <filter-mapping><filter-name>CAS Authentication Filter</filter-name><url-pattern>/*</url-pattern>
    </filter-mapping>

就是这样,请在下面的评论部分中留下您的想法。

翻译自: https://www.javacodegeeks.com/2018/04/how-to-exclude-a-url-from-a-filter.html

过滤器过滤特定的url

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络视频笔记

计算机网络计算机网络和互联网计算机网络(简称网络)internet(互连网)网络的组成网路边缘网络核心应用层传输层(运输层)网络层&#xff1a;数据链路层和局域网物理层网络安全无线和移动网络多媒体网络网络管理计算机网络和互联网 计算机网络(简称网络) 由若干结点和连接这些结…

一个dsp最小系统至少要有_DSP最小系统电路设计

DSP最小系统电路设计第1章绪论DSP有两种涵义&#xff0c;一种是Digital Signal Processing&#xff0c;指的是数字信号处理技术&#xff1b;一种是DigitalSignalProcessor&#xff0c;指的是数字信号处理器。两者是不可分割的&#xff0c;前者是理论上的技术&#xff0c;要通过…

g++默认字符集utf-8_Java可能使用UTF-8作为其默认字符集

g默认字符集utf-8由于基于Java的应用程序通常用于各种各样的操作系统和环境中&#xff0c;因此Java开发人员会遇到与基于字符的输入和输出有关的问题并不少见。 涉及这些问题的博客文章包括《警察的恐怖&#xff1a;默认语言环境&#xff0c;默认字符集和默认时区》 &#xff1…

Linux 的权限表达式

文章目录一、采用权限字母和操作符表达式&#xff08;一&#xff09;授权对象&#xff08;二&#xff09;权限字母符号二、采用权限数字表达式&#xff08;一&#xff09;权限数字&#xff08;二&#xff09;权限组合&#xff08;三&#xff09;命令 chmod 后面的数字含义一、采…

nat 网卡间数据包转发_nat端口转发示例

nat端口转发示例环境&#xff1a;A服务器&#xff1a; 网卡1:192.168.1.151 网卡2:10.10.69.10B服务器&#xff1a; 网卡1:10.10.69.41要求&#xff1a;访问192.168.1.151:1521 即访问 10.10.69.41:1521启用端口转发&#xff1a;echo 1 > /proc/sys/net/ipv4/ip_forward清空…

精通 RPM 之查询篇

文章目录一、命令格式二、选项详解&#xff08;一&#xff09;查询所有已安装的软件包&#xff08;二&#xff09;查询有哪些软件包属于指定的类别&#xff08;三&#xff09;查询有哪些软件包拥有指定文件&#xff08;四&#xff09;查询有哪些包需要指定功能&#xff08;五&a…

如何判断2服务器性能好或坏_无服务器革命:好,坏和丑

如何判断2服务器性能好或坏“这是愚蠢的。 比愚蠢还糟&#xff1a;这是一场营销炒作。” ‐ 理查德斯托曼 &#xff08; Richard Stallman&#xff09;对云计算的评论&#xff0c;2008年9月 而且&#xff0c;十年后&#xff0c;当有人提到这个词时&#xff0c;您开始三思而后…

datax 持续数据同步_采用DataX实现多表增量数据同步

这两天验证了一下阿里的DataX数据同步工具&#xff0c;觉得DataX可以用来做管理数据的多级数据同步。DataX用来做批量数据迁移很适合&#xff0c;能够保证数据的一致性&#xff0c;性能也很好&#xff0c;结合时间戳字段&#xff0c;用来实现数据定时增量同步也是可以的&#x…

Linux RPM包校验和数字证书

文章目录一、Linux RPM 包校验二、Linux RPM 数字证书验证&#xff08;一&#xff09;使用数字证书验证 RPM 包的步骤&#xff08;二&#xff09;安装/卸载数字证书为了能够及时发现文件误删、误修改文件数据、恶意篡改文件内容等问题&#xff0c;Linux 提供了以下两种检测方式…

java 字符串文字筛选_Java的原始字符串文字

java 字符串文字筛选似乎“ 原始字符串文字 ”即将出现在Java中。 JEP 326开始的&#xff08;“原始字符串字面量”&#xff09; 发行JDK-8196004 &#xff0c;并宣布为“新JEP候选人” 3月2日的JEP和相关问题的人指出&#xff0c;“Java的仍然是一小群现代编程语言中的一个不为…

计算机系统常识笔记

计算机系统常识操作系统篇LinuxWindowsAndroidIOSUNIXGNU(GNUs Not Unix!)MacOSDOS处理器(CPU)篇x86ARM处理器显卡(GPU)篇分类性能指标显示存储器显卡频率显存类型流处理器单元显存位宽总线接口类型按当前主流显卡等级划分编译器篇公司篇IntelAMDNVIDIAMicrosoft(微软)IBMOracl…

jsr303jsp页面怎么显示错误信息_springmvc使用JSR-303进行数据校验实例

项目中&#xff0c;通常使用较多的是前端的校验&#xff0c;比如页面中js校验以及form表单使用bootstrap校验。然而对于安全要求较高点建议在服务端进行校验。服务端校验&#xff1a;控制层controller&#xff1a;校验页面请求的参数的合法性。在服务端控制层controller校验&am…

spring @lazy_Spring @Lazy批注用例

spring lazySpring框架几乎可以毫不费力地为您解决许多常见的编程问题&#xff0c;但是其某些功能比其他功能鲜为人知。 在本文中&#xff0c;我们将仔细研究属于该组的Lazy批注。 阅读了几个示例之后&#xff0c;您应该能够将注释应用于日常开发任务。 1. 懒豆初始化 Spring的…

什么是虚数

在数学中&#xff0c;虚数就是形如 ab*i 的数&#xff0c;其中 a、b 是实数&#xff0c;且 b≠0&#xff0c;i -1。虚数这个名词是 17 世纪著名数学家笛卡尔创立&#xff0c;因为当时的观念认为这是真实不存在的数字。后来发现虚数 ab*i 的实部 a 可对应平面上的横轴&#xff…

计算机网络--接入互联网方式

接入网 指将端系统物理连接到其边缘路由器的网络。边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器。 1.家庭接入互联网方式 一般通过DSL、电缆、FTTH、拨号和卫星接入。 数字用户线(DSL) 住户通常从提供本地电话接入的本地电话公司处获得DSL因特网接入。因…

mysqls压力测试怎么用_MySQL压力测试工具使用

一、MySQL自带的压力测试工具——Mysqlslapmysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。mysqlslap为mysql性能优化前后提供了直观的验…

java isempty_Optional.isEmpty()即将加入Java吗?

java isemptyJDK-8184693请求将方法isEmpty()添加到JDK 8引入的Optional类中。 调用Optional.isEmpty()等同于调用! Optional.isPresent() ! Optional.isPresent() 。 当前没有与JDK-8184693关联的JDK版本 &#xff0c;但是它正在积极地工作&#xff0c;如最近发布的名为“ RFR…

如何理解文件存取单位 -- 块(block)

文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。 操作系统读取硬盘的时候&#xff0c;不会一个个扇区地读取&#xff0c;这样效率太低&#xff0c;而是一次性…

知识图谱笔记

知识图谱知识分类陈述性知识过程性知识本体(Ontology)知识库(Knowledge Base)数据库(Database)语义网知识图谱详细解析知识图谱的生命周期知识建模(知识体系构建)知识获取知识融合(知识集成)知识存储、查询和推理(知识服务)知识推理知识应用领域知识图谱的应用金融证券领域医疗…

nslookup 包含在那个包中_nslookup命令详解

Nslookup 是一个监测网络中DNS服务器是否能正确实现域名解析的命令行工具。它在 Windows NT/2000/XP(在之后的windows系统也都可以用的&#xff0c;比如win7,win8等) 中均可使用,但在Windows 98中却没有集成这一个工具。Nslookup 必须要安装了TCP/IP 协议的网络环境之后才能使用…