filter配置多個url-pattern和排除個別servlet


 

轉載自:https://blog.csdn.net/hanghangde/article/details/51298221

侵刪

 

最近做項目遇到一個Filter需要配置多個url-pattern,上網查了下資料,經測試,現總結下
一、完全錯誤的方式

Java代碼   收藏代碼
  1. <filter>  
  2.     <filter-name>authority</filter-name>  
  3.     <filter-class>com.util.AuthorityFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>authority</filter-name>  
  7.     <url-pattern>/pages/cmm/*;/pages/genbill/*</url-pattern>  
  8. </filter-mapping>  


二、有一定作用,但不能實現需要的效果,只會過濾最下面配置的url-pattern。

Java代碼   收藏代碼
  1. <filter>  
  2.     <filter-name>authority</filter-name>  
  3.     <filter-class>com.util.AuthorityFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>authority</filter-name>  
  7.     <url-pattern>/pages/cmm/*</url-pattern>  
  8.        <url-pattern>/pages/genbill/*</url-pattern>  
  9. </filter-mapping>  


三、現在給出正確的配置方式

Java代碼   收藏代碼
  1. <filter>  
  2.     <filter-name>authority</filter-name>  
  3.     <filter-class>com.util.AuthorityFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>authority</filter-name>  
  7.        <url-pattern>/pages/genbill/*</url-pattern>  
  8. </filter-mapping>  
  9. <filter-mapping>  
  10.     <filter-name>authority</filter-name>  
  11.     <url-pattern>/pages/cmm/*</url-pattern>  
  12. </filter-mapping>

 

在web.xml聲明的一個filter中:

<!– session過濾filter –>  

[html]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. <filter>    
  2. <filter-name>SessionFilter</filter-name>    
  3. <filter-class>    
  4. com.iqbon.jcms.web.util.SessionFilter     
  5. </filter-class>    
  6. <init-param>    
  7. <param-name>excludedPages</param-name>    
  8. <param-value>/admin/login.do</param-value>    
  9. </init-param>    
  10. </filter>    
  11. <filter-mapping>    
  12. <filter-name>SessionFilter</filter-name>    
  13. <url-pattern>/admin/*</url-pattern>    
  14. </filter-mapping>    

可以看到url-pattern的設置里面過濾的url規則是/admin/*,如果要把/admin/login.do排除在過濾url之外。

可以結合init-param的初始化參數和HttpServletRequest的getServletPath()方法來判斷。

 

[html]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. <init-param>    
  2. <param-name>excludedPages</param-name>    
  3. <param-value>/admin/login.do</param-value>    
  4. </init-param>    


其次在filter的java代碼中加上判斷:

[java]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. import java.io.IOException;     
  2.   
  3. import javax.servlet.Filter;     
  4. import javax.servlet.FilterChain;     
  5. import javax.servlet.FilterConfig;     
  6. import javax.servlet.ServletException;     
  7. import javax.servlet.ServletRequest;     
  8. import javax.servlet.ServletResponse;     
  9. import javax.servlet.http.HttpServletRequest;     
  10. import javax.servlet.http.HttpServletResponse;     
  11. import javax.servlet.http.HttpSession;     
  12. import org.apache.commons.lang3.StringUtils;     
  13. import com.iqbon.jcms.util.KeyConstant;     
  14.     
  15. /**   
  16. * session過濾器   
  17. */    
  18.   
  19. public class SessionFilter implements Filter {     
  20.   
  21. /**   
  22. * 需要排除的頁面   
  23. */    
  24.   
  25. private String excludedPages;       
  26. private String[] excludedPageArray;     
  27.   
  28. /**   
  29. * @see Filter#destroy()   
  30. */    
  31.   
  32. public void destroy() {     
  33. return;     
  34. }     
  35.     
  36. /**   
  37. * 對session進行判斷當前訪問是否有登錄   
  38. */    
  39.   
  40. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {     
  41. boolean isExcludedPage = false;     
  42. for (String page : excludedPageArray) {//判斷是否在過濾url之外     
  43. if(((HttpServletRequest) request).getServletPath().equals(page)){     
  44. isExcludedPage = true;     
  45. break;     
  46. }     
  47. }     
  48.   
  49. if (isExcludedPage) {//在過濾url之外     
  50. chain.doFilter(request, response);     
  51. else {//不在過濾url之外,判斷session是否存在     
  52. HttpSession session = ((HttpServletRequest) request).getSession();     
  53. if (session == null || session.getAttribute(KeyConstant.SESSION_KEY_USER) == null) {     
  54. ((HttpServletResponse) response).sendRedirect(“/login.htm”);     
  55. else {     
  56. chain.doFilter(request, response);     
  57. }     
  58. }     
  59. }     
  60.   
  61. /**   
  62. * 初始化函數,獲取需要排除在外的url   
  63. */    
  64.   
  65. public void init(FilterConfig fConfig) throws ServletException {     
  66. excludedPages = fConfig.getInitParameter(“excludedPages”);     
  67. if (StringUtils.isNotEmpty(excludedPages)) {     
  68. excludedPageArray = excludedPages.split(“,”);     
  69. }     
  70. return;     
  71. }     
  72. }   

最近做項目遇到一個Filter需要配置多個url-pattern,上網查了下資料,經測試,現總結下
一、完全錯誤的方式

Java代碼   收藏代碼
  1. <filter>  
  2.     <filter-name>authority</filter-name>  
  3.     <filter-class>com.util.AuthorityFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>authority</filter-name>  
  7.     <url-pattern>/pages/cmm/*;/pages/genbill/*</url-pattern>  
  8. </filter-mapping>  


二、有一定作用,但不能實現需要的效果,只會過濾最下面配置的url-pattern。

Java代碼   收藏代碼
  1. <filter>  
  2.     <filter-name>authority</filter-name>  
  3.     <filter-class>com.util.AuthorityFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>authority</filter-name>  
  7.     <url-pattern>/pages/cmm/*</url-pattern>  
  8.        <url-pattern>/pages/genbill/*</url-pattern>  
  9. </filter-mapping>  


三、現在給出正確的配置方式

Java代碼   收藏代碼
  1. <filter>  
  2.     <filter-name>authority</filter-name>  
  3.     <filter-class>com.util.AuthorityFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>authority</filter-name>  
  7.        <url-pattern>/pages/genbill/*</url-pattern>  
  8. </filter-mapping>  
  9. <filter-mapping>  
  10.     <filter-name>authority</filter-name>  
  11.     <url-pattern>/pages/cmm/*</url-pattern>  
  12. </filter-mapping>

 

在web.xml聲明的一個filter中:

<!– session過濾filter –>  

[html]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. <filter>    
  2. <filter-name>SessionFilter</filter-name>    
  3. <filter-class>    
  4. com.iqbon.jcms.web.util.SessionFilter     
  5. </filter-class>    
  6. <init-param>    
  7. <param-name>excludedPages</param-name>    
  8. <param-value>/admin/login.do</param-value>    
  9. </init-param>    
  10. </filter>    
  11. <filter-mapping>    
  12. <filter-name>SessionFilter</filter-name>    
  13. <url-pattern>/admin/*</url-pattern>    
  14. </filter-mapping>    

可以看到url-pattern的設置里面過濾的url規則是/admin/*,如果要把/admin/login.do排除在過濾url之外。

可以結合init-param的初始化參數和HttpServletRequest的getServletPath()方法來判斷。

 

[html]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. <init-param>    
  2. <param-name>excludedPages</param-name>    
  3. <param-value>/admin/login.do</param-value>    
  4. </init-param>    


其次在filter的java代碼中加上判斷:

[java]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. import java.io.IOException;     
  2.   
  3. import javax.servlet.Filter;     
  4. import javax.servlet.FilterChain;     
  5. import javax.servlet.FilterConfig;     
  6. import javax.servlet.ServletException;     
  7. import javax.servlet.ServletRequest;     
  8. import javax.servlet.ServletResponse;     
  9. import javax.servlet.http.HttpServletRequest;     
  10. import javax.servlet.http.HttpServletResponse;     
  11. import javax.servlet.http.HttpSession;     
  12. import org.apache.commons.lang3.StringUtils;     
  13. import com.iqbon.jcms.util.KeyConstant;     
  14.     
  15. /**   
  16. * session過濾器   
  17. */    
  18.   
  19. public class SessionFilter implements Filter {     
  20.   
  21. /**   
  22. * 需要排除的頁面   
  23. */    
  24.   
  25. private String excludedPages;       
  26. private String[] excludedPageArray;     
  27.   
  28. /**   
  29. * @see Filter#destroy()   
  30. */    
  31.   
  32. public void destroy() {     
  33. return;     
  34. }     
  35.     
  36. /**   
  37. * 對session進行判斷當前訪問是否有登錄   
  38. */    
  39.   
  40. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {     
  41. boolean isExcludedPage = false;     
  42. for (String page : excludedPageArray) {//判斷是否在過濾url之外     
  43. if(((HttpServletRequest) request).getServletPath().equals(page)){     
  44. isExcludedPage = true;     
  45. break;     
  46. }     
  47. }     
  48.   
  49. if (isExcludedPage) {//在過濾url之外     
  50. chain.doFilter(request, response);     
  51. else {//不在過濾url之外,判斷session是否存在     
  52. HttpSession session = ((HttpServletRequest) request).getSession();     
  53. if (session == null || session.getAttribute(KeyConstant.SESSION_KEY_USER) == null) {     
  54. ((HttpServletResponse) response).sendRedirect(“/login.htm”);     
  55. else {     
  56. chain.doFilter(request, response);     
  57. }     
  58. }     
  59. }     
  60.   
  61. /**   
  62. * 初始化函數,獲取需要排除在外的url   
  63. */    
  64.   
  65. public void init(FilterConfig fConfig) throws ServletException {     
  66. excludedPages = fConfig.getInitParameter(“excludedPages”);     
  67. if (StringUtils.isNotEmpty(excludedPages)) {     
  68. excludedPageArray = excludedPages.split(“,”);     
  69. }     
  70. return;     
  71. }     
  72. }   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM