过滤器过滤特定的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模式“ / *”,即我們的請求將通過兩個身份驗證過程: LDAP和Database,其排序取決于首先在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
總結
以上是生活随笔為你收集整理的过滤器过滤特定的url_如何从过滤器中排除URL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备案担保书(备案担保)
- 下一篇: g++默认字符集utf-8_Java可能