当前位置: 首页 > 面试题库 >

在哪里可以找到将正则表达式应用于输出的Java Servlet过滤器?[关闭]

万俟英锐
2023-03-14
问题内容

我希望有人已经写了这个:

可以使用正则表达式搜索/替换模式配置的servlet过滤器,并将其应用于HTML输出。

这样的事情存在吗?


问题答案:

我找不到一个,所以写了一个:

RegexFilter.java

package com.example;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

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.HttpServletResponse;

/**
 * Applies search and replace patterns. To initialize this filter, the
 * param-names should be "search1", "replace1", "search2", "replace2", etc.
 */
public final class RegexFilter implements Filter {
    private List<Pattern> searchPatterns;
    private List<String> replaceStrings;

    /**
     * Finds the search and replace strings in the configuration file. Looks for
     * matching searchX and replaceX parameters.
     */
    public void init(FilterConfig filterConfig) {
        Map<String, String> patternMap = new HashMap<String, String>();

        // Walk through the parameters to find those whose names start with
        // search
        Enumeration<String> names = (Enumeration<String>) filterConfig.getInitParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            if (name.startsWith("search")) {
                patternMap.put(name.substring(6), filterConfig.getInitParameter(name));
            }
        }
        this.searchPatterns = new ArrayList<Pattern>(patternMap.size());
        this.replaceStrings = new ArrayList<String>(patternMap.size());

        // Walk through the parameters again to find the matching replace params
        names = (Enumeration<String>) filterConfig.getInitParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            if (name.startsWith("replace")) {
                String searchString = patternMap.get(name.substring(7));
                if (searchString != null) {
                    this.searchPatterns.add(Pattern.compile(searchString));
                    this.replaceStrings.add(filterConfig.getInitParameter(name));
                }
            }
        }
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // Wrap the response in a wrapper so we can get at the text after calling the next filter
        PrintWriter out = response.getWriter();
        CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);
        chain.doFilter(request, wrapper);

        // Extract the text from the completed servlet and apply the regexes
        String modifiedHtml = wrapper.toString();
        for (int i = 0; i < this.searchPatterns.size(); i++) {
            modifiedHtml = this.searchPatterns.get(i).matcher(modifiedHtml).replaceAll(this.replaceStrings.get(i));
        }

        // Write our modified text to the real response
        response.setContentLength(modifiedHtml.getBytes().length);
        out.write(modifiedHtml);
        out.close();
    }

    public void destroy() {
        this.searchPatterns = null;
        this.replaceStrings = null;
    }
}

CharResponseWrapper.java

package com.example;

import java.io.CharArrayWriter;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
 * Wraps the response object to capture the text written to it.
 */
public class CharResponseWrapper extends HttpServletResponseWrapper {
    private CharArrayWriter output;

    public CharResponseWrapper(HttpServletResponse response) {
        super(response);
        this.output = new CharArrayWriter();
    }

    public String toString() {
        return output.toString();
    }

    public PrintWriter getWriter() {
        return new PrintWriter(output);
    }
}

示例web.xml

<web-app>
    <filter>
      <filter-name>RegexFilter</filter-name>
      <filter-class>com.example.RegexFilter</filter-class>
      <init-param><param-name>search1</param-name><param-value><![CDATA[(<\s*a\s[^>]*)(?<=\s)target\s*=\s*(?:'_parent'|"_parent"|_parent|'_top'|"_top"|_top)]]></param-value></init-param>
      <init-param><param-name>replace1</param-name><param-value>$1</param-value></init-param>
    </filter>
    <filter-mapping>
      <filter-name>RegexFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>


 类似资料:
  • 问题内容: 我在为ElasticSearch Regexp Filter正确表达正则表达式时遇到问题。我正在尝试匹配url字段中“ info-for / media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press- release-1 。为了尝试正确使用我现在使用的正则表达式,但这最终将与用户的查询字符串一起使用。 POST到localhos

  • 问题内容: 我正在http://www.debuggex.com上构建正则表达式帮助器。我想显示的细节量要求我编写自己的解析器和匹配器。 为了确保解析器和匹配器正常工作,我针对正则表达式的Javascript编写了自己的单元测试,但是这些仅涵盖了我所知道的边缘情况。我想使用一个标准的测试套件,最近指向我将要使用的http://hg.ecmascript.org/tests/test262/summ

  • 问题内容: 我想在Java中构建一个正则表达式,该正则表达式将在FilenameFilter中传递以过滤目录中的文件。 问题是我无法理解正则表达式“思维模型”的问题:) 这是我用来选择要排除的文件的正则表达式 (((ABC | XYZ))+ \ w * Test.xml 我想做的是选择所有以Test.xml结尾但不以ABC或XYZ开头的文件。 您能否添加任何可以帮助我应对正则表达式的资源。 谢谢

  • 我不知道这是因为android-studio做错了什么,还是intelliJ中所有gradle项目都做错了什么,但有时当我运行Build/Debug时,我得到的只是: 我似乎找不到任何方法来获得更多信息,因为这段文字已经出现在我认为是编译器输出的内容上。 我该看哪?

  • 我在我的react.js应用程序中安装了Firebase,安装了FirebaseUI,并让Google sign-in正常工作。但是,Google signin按钮上绝对没有应用css样式表。我在https://firebase.google.com/docs/auth/web/firebaseui这里看了文档,并访问了firebaseui.css文件的cdn链接https://cdn . fir

  • 我在Java的一次采访中被问到这个问题。我不能解决它,但我猜它可以解决使用正则表达式。不确定是否有一种不使用正则表达式的替代方法。有人能帮我用正则表达式吗?或者,如果不使用正则表达式就能解决这个问题。 给定一个平衡括号字符串(它只包含或,并且它已经平衡),我需要查找它内部是否包含模式(表示一个或多个平衡括号表达式)。也就是说,检查它是否在任何中包含3个或更多的。 示例: 对于,预期答案为true,