我们可以在web.xml URL模式中使用正则表达式吗?

Sat*_*tya 32 java web.xml servlet-filters

我正在编写一个过滤器来执行特定任务,但我无法为我的过滤器设置特定的url模式.我的过滤器映射如下:

 <web.xml>
  <filter>
     <filter-name>myFilter</filter-name>
     <filter-class>test.MyFilter</filter-class>
   </filter>

  <filter-mapping>
    <filter-name>myFilter</filter-name>
     <url-pattern>/org/test/*/keys/*</url-pattern>
   </filter-mapping>
 </web-app>
Run Code Online (Sandbox Code Playgroud)

我的网址模式[ /org/test/ * /keys/ * ]不像我预期的那样工作.

我在浏览器中调用网址:

http://localhost:8080/myapp/org/test/SuperAdminReport/keys/superAdminReport.jsp
http://localhost:8080/myapp/org/test/Adminreport/keys/adminReport.jsp
http://localhost:8080/myapp/org/test/OtherReport/keys/otherReport.jsp
Run Code Online (Sandbox Code Playgroud)

因此,对于上面的URL,过滤器模式应该匹配.我怎样才能做到这一点?

Ste*_*n C 42

不,你不能在那里使用正则表达式.根据Java Servlet Specification v2.4(section srv.11.1),url-path的解释如下:

  • 以"/"字符开头并以"/*"后缀结尾的字符串用于路径映射.
  • 以"*"开头的字符串 prefix用作扩展映射.
  • 仅包含'/'字符的字符串表示应用程序的"默认"servlet.在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为null.
  • 所有其他字符串仅用于完全匹配.

不允许正则表达式.甚至没有复杂的外卡.


Gus*_*Gus 11

正如其他人所指出的那样,只能使用基本的servlet过滤器功能来过滤正则表达式匹配.servlet规范可能是以允许有效匹配url的方式编写的,并且因为servlet早于java中正则表达式的可用性(正则表达式在java 1.4中到达).

正则表达式可能性能较差(不,我没有对它进行基准测试),但是如果你没有受到处理时间的强烈约束并希望交换性能以便于配置,你可以这样做:

在您的过滤器中:

private String subPathFilter = ".*";
private Pattern pattern;

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    String subPathFilter = filterConfig.getInitParameter("subPathFilter");
    if (subPathFilter != null) {
      this.subPathFilter = subPathFilter;
    }
    pattern = Pattern.compile(this.subPathFilter);
  }

  public static String getFullURL(HttpServletRequest request) {
    // Implement this if you want to match query parameters, otherwise 
    // servletRequest.getRequestURI() or servletRequest.getRequestURL 
    // should be good enough. Also you may want to handle URL decoding here.
  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    Matcher m = pattern.matcher(getFullURL((HttpServletRequest) servletRequest));
    if (m.matches()) {

      // filter stuff here.

    }
  }
Run Code Online (Sandbox Code Playgroud)

然后在web.xml中...

  <filter>
    <filter-name>MyFiltersName</filter-name>
    <filter-class>com.example.servlet.MyFilter</filter-class>
    <init-param>
      <param-name>subPathFilter</param-name>
      <param-value>/org/test/[^/]+/keys/.*</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>MyFiltersName</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
Run Code Online (Sandbox Code Playgroud)

通过反转if语句来使模式排除匹配有时也很方便doFilter()(或者为了排除模式添加另一个init参数,这留给了读者的练习.)


hav*_*exz 5

您的网址无法正常工作,因为它不是有效的网址格式.您可以参考以下回复

网址规范