Filter过滤非法字符

示例:定义一个Filter,用于用户发言中出现的“晕”字,即如果没有这个字则允许发言,如果有这个字则不允许发言并提示错误。

CharForm.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 
 3 <html>
 4   <head></head>
 5   
 6   <body>
 7 <%-- 表单,提交方式为post,提交到DoGetDemo --%>
 8 <form action="ShowContent.jsp" method="post">
 9 用户名:<input type="text" name="username"><br />
10 发言:<br />
11 <textarea name="charContent" rows="20" cols="40"></textarea><br />
12 <input type="submit" value="提交">
13 <input type="reset" value="重置">
14 </form>
15   </body>
16 </html>

浏览器显示:

CharFilter.java

 1 package com.mhb;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 
13 public class CharFilter implements Filter {
14 
15 public void init(FilterConfig arg0) throws ServletException {
16 System.out.println("非法文字过滤器初始化!");
17 }
18 public void doFilter(ServletRequest arg0, ServletResponse arg1,
19 FilterChain arg2) throws IOException, ServletException {
20 //设置参数的接收格式
21 HttpServletRequest request = (HttpServletRequest)arg0;
22 //设置参数的编码格式
23 request.setCharacterEncoding("utf-8");
24 //接收聊天内容
25 String charContent = request.getParameter("charContent");
26 
27 if(charContent != null){
28 // 等号右边的-1表示没有找到该字符串,
29 //0表示该字符串位于第一个字符,1表示位于第二个字符。
30 if(charContent.indexOf("晕")== -1){  
31 arg2.doFilter(arg0, arg1);
32 }else{
33 request.getRequestDispatcher("/SendFailure.jsp").forward(arg0, arg1);
34 }
35 }else{
36 arg2.doFilter(arg0, arg1);
37 }
38 }
39 public void destroy() {
40 System.out.println("非法文字过滤器销毁!");
41 }
42 }

ShowContent.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 
 3 <html>
 4   <head><title>发言成功!</title></head>
 5   <body>
 6       <center>
 7 <h1>发言成功</h1>
 8 用户名:${param.username}<br />
 9 发言内容:${param.charContent }    
10 </center>
11   </body>
12 </html>

SendFailure.jsp

 1 SendFailure .txt
 2 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 3 
 4 <html>
 5   <head><title>发言失败</title></head>
 6   
 7   <body>
 8 <center>
 9 <h1>发言失败,含有非法字符!</h1>
10 </center>
11   </body>
12 </html>

web.xml配置

  <filter>
      <filter-name>CharFilter</filter-name>
      <filter-class>com.mhb.CharFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>CharFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

 

以上为所涉及到的代码,下面输入不含“晕”的发言内容

发言内容中包含“晕”字,直接跳转到发言失败页面。

### Java 实现非法字符过滤Java 中可以通过正则表达式来实现对字符串中非法字符过滤。以下是基于引用中的 `IllegalCharacterFilter` 的概念[^1],并结合实际需求编写的一个通用方法: ```java import java.util.regex.Pattern; public class IllegalCharacterFilter { private static final String ILLEGAL_CHARACTERS_REGEX = "[\\\\/:\"*?<>|]"; public static String filterIllegalCharacters(String input) { if (input == null || input.isEmpty()) { return ""; } // 使用正则表达式替换非法字符为空字符串 String result = Pattern.compile(ILLEGAL_CHARACTERS_REGEX).matcher(input).replaceAll(""); // 返回处理后的字符串 return result; } public static void main(String[] args) { String testString = "example<file>name*.txt"; System.out.println("原始字符串:" + testString); System.out.println("过滤字符串:" + filterIllegalCharacters(testString)); } } ``` 上述代码通过正则表达式匹配常见的非法字符(如 `\ / : * ? " < > |`),并将这些字符从输入字符串中移除。 --- ### Python 实现非法字符过滤 对于 Python 而言,可以参考引用中的 `clean_filename` 方法[^2],并对其实现进一步扩展以适应更广泛的场景: ```python import re def filter_illegal_characters(filename): # 定义非法字符的正则表达式 illegal_chars_pattern = r'[\\/:*"<>|]' # 替换非法字符为下划线 filtered_name = re.sub(illegal_chars_pattern, '_', filename) # 去掉文件名开头可能存在的点和空格 filtered_name = filtered_name.lstrip('. ') # 限制文件名长度不超过 255 字符 if len(filtered_name) > 255: filtered_name = filtered_name[:255] return filtered_name # 测试函数 if __name__ == "__main__": test_string = "example<file>name*.txt" print(f"原始字符串:{test_string}") print(f"过滤字符串:{filter_illegal_characters(test_string)}") ``` 此代码同样利用正则表达式识别非法字符,并将其替换为安全字符 `_` 或者直接删除它们。 --- ### 性能优化建议 如果需要频繁调用该功能,可考虑预编译正则表达式模式以提高性能。例如,在 Java 和 Python 中分别有以下改进方式: #### Java 改进版 将正则表达式的编译操作提取到静态初始化阶段: ```java private static final Pattern ILLEGAL_PATTERN = Pattern.compile("[\\\\/:\"*?<>|]"); public static String filterIllegalCharactersOptimized(String input) { if (input == null || input.isEmpty()) { return ""; } return ILLEGAL_PATTERN.matcher(input).replaceAll(""); } ``` #### Python 改进版 提前创建正则对象以便重复使用: ```python illegal_chars_pattern = re.compile(r'[\\/:*"<>|]') def filter_illegal_characters_optimized(filename): filtered_name = illegal_chars_pattern.sub('_', filename) filtered_name = filtered_name.lstrip('. ') if len(filtered_name) > 255: filtered_name = filtered_name[:255] return filtered_name ``` --- ### 注意事项 - 不同操作系统对文件命名规则的要求不同,因此需根据目标平台调整非法字符列表。 - 如果涉及国际化支持,则还需注意 Unicode 编码下的特殊字符处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值