特定于请求参数的 Java 过滤器 URL 模式

Posted

技术标签:

【中文标题】特定于请求参数的 Java 过滤器 URL 模式【英文标题】:Java Filter URL pattern specific to request params 【发布时间】:2011-02-01 01:54:42 【问题描述】:

我们有一种情况,我们想对包含一些特定请求参数的 URL 使用过滤器,例如:

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

等等,id 是在运行时获取的,我只想在web.xml 中配置过滤器formtype=special_form。应该如何实现解决方案?过滤器可以配置正则表达式模式吗?

【问题讨论】:

为什么要在filter mapping中做呢?除了“*”之外,不能使用任何东西,而且几乎任何东西都可以在过滤器的 doFilter 方法中检查。正则表达式过滤器映射有用的唯一条件是当您无权访问过滤器的源时。这是你的情况吗? 你必须看到一些非常糟糕的代码,但它就在那里。我有一个继承的 java web 应用程序,我需要重写它。没有servlet!您在 web-inf 目录之外直接访问 jsps,因此我必须编写一个过滤器来拦截和阻止某些 url 请求。 【参考方案1】:

据我所知,没有直接在web.xml 中通过查询字符串将请求匹配到过滤器的解决方案。因此,您可以使用 init-params 在您的 web.xml 中注册过滤器,以使过滤器可配置,并在您的 javax.servlet.Filter 实现中通过 void init(FilterConfig filterConfig) 设置模式。

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");
    


您的 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>

进一步阅读:http://java.sun.com/javaee/5/docs/api/javax/servlet/Filter.html

【讨论】:

谢谢,您的回答对我来说真的像魔术一样。非常感谢您的帮助。谢谢,罗希特。 支持从 Apache mod_rewrite(RewriteRule 等)已知的模式的过滤器可在此处获得:tuckey.org/urlrewrite【参考方案2】:

您必须在过滤器的正文中解析 URL 参数,不在 web.xml 中

我做了这样的事情,但我使用了一个阶段侦听器,一个配置条目(在配置文件中),将 URL 参数映射到处理特定“动作”的类的 FQN(我的动作是指来自获取/发布);比,阶段侦听器将解析来自每个 GET/POST 的所有 URL 参数,并将它们中的每一个发送到调度程序。 Dispatcher 的工作是调用正确的处理程序(对应于该 URL 参数的 FQN 的单例对象)。然后,处理程序只使用他收到的 URL 值执行特定操作。

同样的事情可以通过使用过滤器而不是相位监听器来实现。

【讨论】:

以上是关于特定于请求参数的 Java 过滤器 URL 模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Thrift 服务中使用特定于 java 的类型?

如何在 Spring Cloud Gateway 中添加特定于路由的自定义过滤器

使用特定于列的重复过滤器在 Python 中将行附加到 CSV

如何在 java Servlet 过滤器中更改传入 URL 并将请求重定向到新 URL [重复]

在全局(单例)服务中使用特定于请求的上下文

java,防止用ajax中的url 直接访问,怎么处理呀?