zoukankan      html  css  js  c++  java
  • 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. }   
  • 相关阅读:
    [BZOJ 4117] Weather Report
    [BZOJ 3233] 找硬币
    集合迭代器Iterator
    如何实现数组与List的相互转换?在 Queue 中 poll()和 remove()有什么区别?哪些集合类是线程安全的?
    ArrayList分别与LinkedList、Vector、Array的区别
    HashMap与TreeMap
    HashSet原理
    并发场景下HashMap死循环导致CPU100%的问题
    HashMap工作原理
    HashMap与HashTable的区别
  • 原文地址:https://www.cnblogs.com/zou-rong/p/10119660.html
Copyright © 2011-2022 走看看