Java Filter URL pattern specific to request params

后端 未结 2 1847
广开言路
广开言路 2020-12-10 09:07

We have a situation where we want to use filter for URL\'s containing some specific request parameters, e.g:

http://mydomain.com/?id=78&formtype=simple_form&.....         


        
相关标签:
2条回答
  • 2020-12-10 09:47

    As far as I know there is no solution for matching requests to filters by query string directly in web.xml. So you could register the filter in your web.xml using init-params to make the filter configurable and set a pattern via void init(FilterConfig filterConfig) in your javax.servlet.Filter implementation.

    package mypackage;
    
    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 MyFilter implements Filter {
    
        private String pattern;
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            // check whether we have a httpServletRequest and a pattern
            if (this.pattern != null && request instanceof HttpServletRequest) {
                // resolve the query string from the httpServletRequest
                String queryString = ((HttpServletRequest) request).getQueryString();
                // check whether a query string exists and matches the given pattern
                if (queryString != null && queryString.matches(pattern)) {
                    // TODO do someting special
                }
            }
            chain.doFilter(request, response);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            this.pattern = filterConfig.getInitParameter("pattern");
        }
    
    }
    

    The configuration would look like this in your web.xml:

    <!-- MyFilter -->
    <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>mypackage.MyFilter</filter-class>
        <init-param>
            <param-name>pattern</param-name>
            <param-value>{{PATTERN HERE}}</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    Further readings:
    http://java.sun.com/javaee/5/docs/api/javax/servlet/Filter.html

    0 讨论(0)
  • 2020-12-10 10:06

    You must parse the URL params in the body of the filter, not in web.xml;

    I made such a thing, but I used a phase listener, a configuration entry (in a configuration file) that mapped URL params to FQN of classes that handle a particular "action" (by action I mean a URL param from a GET/POST); than, the phase listener would parse all the URL params from each GET/POST and send each of them to a Dispatcher. The Dispatcher's job is to call the right handler (singleton object corresponding to the FQN for that URL param). The handler then just does the specific thing with the URL value he receives.

    The same thing can be made by using a filter instead of phase listener.

    0 讨论(0)
提交回复
热议问题