2015-07-09 10 views
9

Ich benutze einen Filter URL-Muster für den angemeldeten Benutzer zu überprüfen.@WebFilter ausschließen url-pattern

Aber ich habe viele URL-Muster, die ich filtern müssen.

{ "/table/*", "/user/*", "/contact/*", "/run/*", "/conf/*", ..., ..., ...} 

Es wird unwartbar. Es wird einfacher sein, nur auszuschließen:

{ "/", "/login", "/logout", "/register" } 

Wie kann ich das erreichen?

@WebFilter(urlPatterns = { "/table/*","/user/*", "/contact/*","/run/*","/conf/*"}) 
public class SessionTimeoutRedirect implements Filter { 

    protected final Logger logger = LoggerFactory.getLogger("SessionFilter"); 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     if (request.getSession().getAttribute("Id") != null) { 
      chain.doFilter(req, res); 
     } else { 
      logger.debug("session is null:"+request.getRequestURL());      
      response.sendRedirect(request.getContextPath()+"/login"); 
     } 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 

    } 

    @Override 
    public void destroy() { 

    } 

} 

Antwort

18

Die Servlet-API unterstützt kein "Exclude" -URL-Muster.

Ihre beste Wette ist, nur auf /* abzubilden und vergleichen Sie die HttpServletRequest#getRequestURI() gegen die Menge der zulässigen Pfade.

@WebFilter("/*") 
public class LoginFilter implements Filter { 

    private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>(
     Arrays.asList("", "/login", "/logout", "/register"))); 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     HttpSession session = request.getSession(false); 
     String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", ""); 

     boolean loggedIn = (session != null && session.getAttribute("Id") != null); 
     boolean allowedPath = ALLOWED_PATHS.contains(path); 

     if (loggedIn || allowedPath) { 
      chain.doFilter(req, res); 
     } 
     else { 
      response.sendRedirect(request.getContextPath() + "/login"); 
     } 
    } 

    // ... 
} 
3

können Sie initParam verwenden, um einige ausgeschlossen Muster zu haben und Ihre Logik zu implementieren. Dies ist im Grunde die gleiche wie BalusC's Antwort außer durch initParam Verwendung kann es in der web.xml geschrieben werden, wenn Sie wollen/müssen.

Below Ich ignorierte einige binäre (jpeg jpg png pdf) Erweiterungen:

@WebFilter(urlPatterns = { "/*" }, 
    initParams = { @WebInitParam(name = "excludedExt", value = "jpeg jpg png pdf") } 
) 
public class GzipFilter implements Filter { 

    private static final Set<String> excluded; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     String excludedString = filterConfig.getInitParameter("excludedExt"); 
     if (excludedString != null) { 
      excluded = Collections.unmodifiableSet(
       new HashSet<>(Arrays.asList(excludedString.split(" ", 0)))); 
     } else { 
      excluded = Collections.<String>emptySet(); 
     } 
    } 

    boolean isExcluded(HttpServletRequest request) { 
     String path = request.getRequestURI(); 
     String extension = path.substring(path.indexOf('.', path.lastIndexOf('/')) + 1).toLowerCase(); 
     return excluded.contains(extension); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 
     System.out.print("GzipFilter"); 
     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     HttpServletResponse httpResponse = (HttpServletResponse) response; 
     if (isExcluded(httpRequest)) { 
      chain.doFilter(request, response); 
      return; 
     } 

     // Do your stuff here 
    } 
}