想来问一下为什么这个过滤器只能过滤英文,我中文打进去变成乱码又可以提交啦,不知道怎么改嘞


package filter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

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.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter("/submit_comment")
public class submitcommentfilter implements Filter {
    
    private List<String> dirtyWords = Arrays.asList("haha", "lala", "bubu");

    public void init(FilterConfig config) throws ServletException {
        // 初始化过滤器
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        String comment = req.getParameter("comment");

        if (comment != null) {
            // 对参数值进行解码
            comment = java.net.URLDecoder.decode(comment, "UTF-8");
        }

        if (hasDirtyWords(comment)) {
            res.setContentType("text/html; charset=UTF-8");
            res.getWriter().write("您提交的评论含有敏感词汇,请重新输入。");
        } else {
            // 执行下一个过滤器或目标资源
            chain.doFilter(request, response);
        }
    }

    public void destroy() {
        // 销毁过滤器
    }

    private boolean hasDirtyWords(String comment) {
        for (String dirtyWord : dirtyWords) {
            if (comment != null && comment.indexOf(dirtyWord) != -1) {
                return true;
            }
        }
        return false;
    }
}

你的字典不就是英文的

img

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7552339
  • 你也可以参考下这篇文章:从键盘输入一行英文字符串,只统计字符串中出现的每个英文字母的个数。
  • 除此之外, 这篇博客: 三种注释方法中的 ,通常用一句或者一段话简要描述该类的作用,以英文句号作为结束; 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  单行示例,多行示例:

    //单行示例:
    
    package org.springframework.util;
    
    /**
      Miscellaneous {@link String} utility methods.
    */
    
    public abstract class StringUtils {
    
    
    
    
    //多行示例:
    
    package java.lang;
    
    /**
      Class {@code Object} is the root of the class hierarchy.
      Every class has {@code Object} as a superclass. All objects,
      including arrays, implement the methods of this class.
    */
    
    public class Object {} 

    在注释中出现以@***被称之为Javadoc文档标记,是JDK定义好的,如@author、@version、@since、@see、@link、@code、@param、@return、@exception、@throws等。

    @link的使用语法{@link 包名.类名#方法名(参数类型)},其中当包名在当前类中已经导入了包名可以省略,可以只是一个类名,也可以是仅仅是一个方法名,也可以是类名.方法名,使用此文档标记的类或者方法,可用通过按住Ctrl键+单击 可以快速跳到相应的类或者方法上,解析成html其实就是使用< code> 包名.类名#方法名(参数类型)< /code>

    @link示例

    // 完全限定的类名
    {@link java.lang.Character}
    
    // 省略包名
    {@link String}
    
    // 省略类名,表示指向当前的某个方法
    {@link #length()}
    
    // 包名.类名.方法名(参数类型)
    {@link java.lang.String#charAt(int)} 

    {@code text} 会被解析成<code> text </code>
    将文本标记为代码样式的文本,在code内部可以使用 < 、> 等不会被解释成html标签, code标签有自己的样式。

    一般在Javadoc中只要涉及到类名或者方法名,都需要使用@code进行标记。

    详细描述一般用一段或者几个锻炼来详细描述类的作用,详细描述中可以使用html标签,如<p>、<pre>、<a>、<ul>、<i>等标签, 通常详细描述都以段落p标签开始。
    详细描述和概要描述中间通常有一个空行来分割。

    package org.springframework.util;
    
    /**
      Miscellaneous {@link String} utility methods.
     
      <p>Mainly for internal use within the framework; consider
      <a href="http://commons.apache.org/proper/commons-lang/">Apache's Commons Lang</a>
      for a more comprehensive suite of {@code String} utilities.
     
      <p>This class delivers some simple functionality that should really be
      provided by the core Java {@link String} and {@link StringBuilder}
      classes. It also provides easy-to-use methods to convert between
      delimited strings, such as CSV strings, and collections and arrays.
    */
    
    public abstract class StringUtils {
    
    
    

    一般段落都用p标签来标记,凡涉及到类名和方法名都用@code标记,

    凡涉及到组织的,一般用a标签提供出来链接地址。

    一般类中支持泛型时会通过@param来解释泛型的类型。

    /**
     @param <E> the type of elements in this list
    */
    
    public interface List<E> extends Collection<E> {}

    详细描述后面一般使用@author来标记作者,如果一个文件有多个作者来维护就标记多个@author,@author 后面可以跟作者姓名(也可以附带邮箱地址)、组织名称(也可以附带组织官网地址)。

    // 纯文本作者
    @author Rod Johnson
    
    // 纯文本作者,邮件
    @author Igor Hersht, igorh@ca.ibm.com
    
    // 超链接邮件 纯文本作者
    @author <a href="mailto:ovidiu@cup.hp.com">Ovidiu Predescu</a>
    
    // 纯文本邮件
    @author shane_curcuru@us.ibm.com
    
    // 纯文本 组织
    @author Apache Software Foundation
    
    // 超链接组织地址 纯文本组织
    @author <a href="https://jakarta.apache.org/turbine"> Apache Jakarta Turbine</a>

    @see 一般用于标记该类相关联的类,@see即可以用在类上,也可以用在方法上。

    /**
      @see IntStream
      @see LongStream
      @see DoubleStream
      @see <a href="package-summary.html">java.util.stream</a>
    */
    
    public interface Stream<T> extends BaseStream<T, Stream<T>> {}
    
    
    
  • 您还可以看一下 张传波老师的软件设计是怎样炼成的?课程中的 详细设计使用招数小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于这个问题,可能是因为过滤器使用的编码格式不支持中文字符,需要对该过滤器进行修改,使其支持中文字符。

    具体步骤如下: 1. 确认当前过滤器使用的编码格式,一般为UTF-8编码。 2. 修改过滤器的解析规则,使其支持中文字符。可以使用Java的正则表达式来完成这个任务。 3. 确保过滤器在处理中文字符时不出现乱码,可以在过滤器中添加字符编码转换的代码。

    简单的代码实现如下:

    public class ChineseFilter implements Filter {
        private static String encoding = "UTF-8";
    
        public void init(FilterConfig config) throws ServletException {
            //初始化配置
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            request.setCharacterEncoding(encoding); //设置请求编码
            response.setCharacterEncoding(encoding); //设置响应编码
    
            String input = request.getParameter("input"); //获取待过滤字符串
            if(input != null){
                Pattern pattern = Pattern.compile("[^\u4e00-\u9fa5]"); //匹配所有非中文字符
                Matcher matcher = pattern.matcher(input);
                input = matcher.replaceAll(""); //过滤掉所有非中文字符
                request.setAttribute("filteredInput", input); //将过滤后的字符串存入request域中
            }
            chain.doFilter(request, response); //继续执行过滤器链
        }
    
        public void destroy() {
            //销毁过滤器
        }
    }
    

    在以上代码中,我们使用了Java的正则表达式来匹配所有非中文字符,并调用Matcher的replaceAll方法将其替换成空字符串,以达到过滤的效果。最后将过滤后的字符串存入request域中,以便后续使用。

    同时需要注意的是,为了避免出现乱码,我们需要在过滤器中对请求和响应的字符编码进行设置。在以上代码中,我们使用了UTF-8编码来设置字符编码,你可以根据实际情况进行修改。