package com.pcm.web.pubs.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
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;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @author
*/
public class CharFilter implements Filter {
private List names = new ArrayList();
private List values = new ArrayList();
/**
* @see javax.servlet.Filter#void ()
*/
public void destroy() {
}
/**
* @see javax.servlet.Filter#void (javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(
ServletRequest req,
ServletResponse res,
FilterChain chain)
throws ServletException, IOException {
int skipNum = 0;
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
Map map = request.getParameterMap();
Set keySet = map.keySet();
StringBuffer url = request.getRequestURL().append("?");
for (Iterator it = keySet.iterator(); it.hasNext();) {
String name = it.next().toString();
String value = request.getParameter(name);
//=======================开始过滤字符=====================================
if (value != null) {
System.out.println(
" ================== " + names + " " + values);
boolean bTrim = !value.equals(value.trim());
//两端空格
if (bTrim) {
value = value.trim();
skipNum++;
}
StringBuffer tmp = new StringBuffer(value);
boolean bSkip = false;
for (int i = 0; i < names.size(); i++) {
if (tmp.toString().indexOf((String) names.get(i)) != -1) {
bSkip = true;
break;
}
}
if (bSkip) {
//这里比较麻烦,是因为我用的jdk 1.3
//如果使用jdk 1.4以上版本,直接使用replaceAll()方法,即可替换所有的字符
//jdk 1.4 替换' 为 "" : value.replaceAll("\'","\"") ,够简单吧
for (int i = 0; i < tmp.length(); i++) {
char tmpChar = tmp.charAt(i);
for (int j = 0; j < names.size(); j++) {
if (String
.valueOf(tmpChar)
.equalsIgnoreCase(names.get(j).toString())) {
tmp.replace(i, i + 1, values.get(j).toString());
}
}
}
skipNum++;
value = tmp.toString();
}
//单引号
boolean bYinHao = tmp.toString().indexOf("\'") != -1;
if (bYinHao) {
for (int i = 0; i < url.length(); i++) {
if (tmp.charAt(i) == '\'') {
tmp.replace(i, i + 1, "\"");
}
}
skipNum++;
value = tmp.toString();
}
}
//=======================================================================
url.append(name).append("=").append(value).append("&");
}
if (skipNum > 0) {
System.out.println(url);
String urlStr = url.toString();
//注意,这里是要把编码再从gb2312倒转为ISO8859-1,因为表单参数传递使用的是ISO8859-1编码
urlStr = new String(urlStr.getBytes("gb2312"), "ISO8859-1");
response.sendRedirect(urlStr);
} else {
chain.doFilter(request, response);
}
}
/**
* Method init.
* @param config
* @throws javax.servlet.ServletException
*/
public void init(FilterConfig config) throws ServletException {
String charName = config.getInitParameter("charName");
String charValue = config.getInitParameter("charValue");
//这里比较麻烦,是因为我使用的是jdk1.3
//如果jdk 1.4以上, String[] names=charName.spilt(",");
//就可以把字符串按指定分割符分割为数组
StringTokenizer stkName = new StringTokenizer(charName, ",");
while (stkName.hasMoreTokens()) {
names.add(stkName.nextToken());
}
StringTokenizer stkValue = new StringTokenizer(charValue, ",");
while (stkValue.hasMoreTokens()) {
values.add(stkValue.nextToken());
}
}
}
2.web.xml配置filter
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp">
<display-name>TclRender</display-name>
<filter>
<filter-name>CharFilter</filter-name>
<display-name>CharFilter</display-name>
<filter-class>com.pcm.web.pubs.servlet.CharFilter</filter-class>
<init-param>
<param-name>charName</param-name>
<param-value>',^</param-value> <!-- , 为分隔符 -->
</init-param>
<init-param>
<param-name>charValue</param-name>
<param-value>",~</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
分享到:
相关推荐
- `filter(String str)`:核心过滤方法,遍历整个输入字符串,执行非法字符的检测与替换操作。 3. **动态配置非法字符**: - `put(String key)`:允许动态添加新的非法字符及其替代字符串,同时更新`maxLength`以...
本文将深入探讨标题中的两个关键类:`XssFilter.java` 和 `XssHttpServletRequestWrapper.java`,以及它们在过滤非法字符中的作用。 首先,`XssFilter.java` 是一个实现了Servlet过滤器接口(javax.servlet.Filter...
本文将详细讲解如何利用监听器进行访问计数以及通过过滤器来过滤非法字符,以确保系统的安全性和用户体验。 首先,我们来看监听器。在Java的Servlet规范中,监听器是一种特殊的Servlet组件,它能够监听特定的事件并...
2. **过滤非法字符**: 非法字符可能引起安全问题或者导致程序异常。过滤器可以检测和替换或者移除这些字符。例如,用户提交的数据中可能存在SQL注入攻击的特殊字符,过滤器可以检查并过滤这些字符,防止恶意操作。...
二是清洗,如果检测到非法字符,将其替换或删除。这在表单提交、实时输入验证、AJAX数据发送等场合尤为关键,能防止SQL注入、XSS跨站脚本攻击等安全问题。 二、jQuery实现字符过滤 1. **自定义事件监听**:可以...
Java 正则表达式过滤特殊字符的正则表达式 Java 正则表达式是 Java 语言中的一种强大的文本处理工具,能够对字符串进行复杂的匹配、提取和替换操作。本文将详细介绍 Java 正则表达式在过滤特殊字符方面的应用。 ...
- 使用`getParameter()`或`getParameterValues()`获取参数后,可以对每个参数值执行自定义的过滤逻辑,例如使用正则表达式检查非法字符,或者替换敏感信息。 - 过滤后的参数可以使用`request.setAttribute()`方法...
### Python SQL注入与过滤非法字符详解 在软件开发过程中,特别是在Web应用开发中,SQL注入是一种常见的安全威胁。为了防止这种攻击,开发者需要确保输入到应用程序中的数据是安全的,尤其是那些将被直接用于构建...
// 过滤非法字符 paramValue = paramValue.replaceAll("[<>\"\'%]", ""); } req.setParameter(paramName, paramValues); } chain.doFilter(request, response); } } ``` 在这个例子中,我们使用正则...
具体实现细节可能包括对请求或响应的特定处理,比如添加日志、改变字符编码、过滤非法请求等。 ### 六、源码学习与实践 为了深入理解过滤器,你可以通过阅读并分析`TFilter`源码来了解其具体实现。同时,你可以...
例如,在实际项目中,可能需要过滤用户输入的非法字符,或者从大量文本数据中提取有用的信息,这些都可以借助正则表达式的强大功能来实现。 总结来说,Java 中的正则表达式是非常有用的工具,它可以帮助我们高效地...
本主题聚焦于“自定义过滤各种字符串”,旨在帮助开发者掌握如何有效地过滤字符串中的乱码以及根据自定义规则去除非法字符。我们将深入探讨这个话题,并提供一系列相关的知识点。 一、字符串乱码处理 1. 乱码产生...
【Java Filter过滤器详解】 Java Filter是Java Servlet技术的一部分,它允许开发者在Servlet容器中对HTTP请求和响应进行拦截处理,实现数据过滤、权限控制、日志记录等多种功能。Filter的生命周期包括三个主要方法...
过滤非法文字的功能通常应用于用户输入验证、内容发布系统、社交媒体平台等场景。 实现这样的功能,开发者通常会编写一段代码,这段代码可能包含以下关键部分: 1. **定义非法字符集**:首先,你需要确定哪些字符...
**Filter过滤器详解** 在Java Web开发中,Filter过滤器是一种强大的工具,它属于JavaEE规范中的重要组成部分,与Servlet程序、Listener监听器并称为三大组件。Filter的主要职责是拦截客户端的请求和服务器的响应,...
然后,在项目的`src`目录下创建对应的JS文件,例如`filter.js`,用于编写过滤非法文字的逻辑。 在`filter.js`中,你可以定义一个函数,接收用户输入的字符串作为参数,然后利用正则表达式进行匹配和替换。例如: `...
在这个类的Write方法中,实现了过滤非法词汇的逻辑。具体地,该方法首先将响应数据从字节流转换为字符串,然后利用正则表达式定义要被过滤掉的非法词汇。接着,遍历每一个非法词汇,并将其从字符串中移除,替换成...
接下来,我们讨论验证码的Filter过滤器: 1. **创建Filter**:在Java Web应用中,Filter是一个实现了`javax.servlet.Filter`接口的类,用于拦截HTTP请求。在本例中,我们可以创建一个名为`VerifyCaptchaFilter`的...
字符串过滤通常指的是去除或替换字符串中的不必要、非法或潜在危险的字符。这在诸如用户输入验证、URL编码、HTML清理等场景中非常有用,可以防止SQL注入、跨站脚本攻击(XSS)等安全问题。 PHP提供了多种内置函数来...
在IT行业中,尤其是在Web开发和数据处理领域,过滤HTML元素字符是一项重要的任务。这主要涉及到对用户输入的数据进行清理和安全处理,以防止跨站脚本(XSS)攻击和其他潜在的安全威胁。本文将深入探讨如何过滤HTML...