实例的功能:对用户输入的敏感字眼进行过滤
应用场景:评论功能有时候需要对用户输入的某些敏感字眼进行过滤
例子: 文本框输入 你是SB菜鸟
过滤后数据 你是**菜鸟
Servlet类说明
/* 创建内部类Request,
该类继承HttpServletRequestWrapper,
是HttpServletRequest的装饰类,
用来改变HttpServletRequest的状态,
从而达到对请求内容的过滤的功能 */
class Request extends HttpServletRequestWrapper{
public Request(HttpServletRequest request) {
super(request);
}
/* 重写getParameter方法
对请求结果进行过滤 */
public String getParameter(String name) {
return MyFilterOne.filter(super.getRequest().getParameter("name"));
}
/* 重写getParameterValues方法
通过循环取出每一个请求结果
再对请求结果进行过滤 */
public String[] getParameterValues(String name) {
String values[]=super.getRequest().getParameterValues("name");
for(int i=0;i<values.length;i++) {
values[i]=MyFilterOne.filter(values[i]);
}
return values;
}
}
Filter 类内容
public class MyFilterOne implements Filter {
private String words[];//存放规定的敏感字
private String encoding;//存放要使用的编码格式
public MyFilterOne() {
}
public void init(FilterConfig fConfig) throws ServletException {
words=new String[] {"糟糕","混蛋"};//定义敏感字符
encoding=fConfig.getInitParameter("encoding");
}
public void destroy() {
this.words=null;
this.encoding =null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if(encoding!=null) {
request.setCharacterEncoding(encoding);//设置request字符编码
request=new Request((HttpServletRequest)request);
//将传递的ServletRequest对象转化为自定义的Request对象,即可实现非法字符的过滤
response.setContentType("text/html;charset="+encoding);//设置response字符编码
}
chain.doFilter(request, response);
}
/*创建过滤方法filter
* 当敏感字不为空的时候,
* 分别对每一个敏感字循环一次
* 如果在param中发现敏感字则将其替换为“****” */
public static String filter(String param) {
try{if(words!=null&&words.length>0) {
for(int i=0;i<words.length;i++) {
if(param.indexOf(words[i])!=-1) {
param=param.replaceAll(words[i], "****");
}
}
}}catch(Exception e) {
e.printStackTrace();
}
return param;
}
web.xml 的 Servlet配置 Filter配置
====================================
HttpServletRequestWrapper类的说明
-
filter好处说明
filter是非常有用的,它引入了一个功能强大的拦截模式。
它可以在request到达servlet之前拦截HttpServletRequest对象,也可以在服务方法转移控制后拦截HttpServletResponse对象。使用filter对象完成的任务有:检查用户的输入、以及压缩web内容。
-
但是在应用中往往想改变HttpServletRequest对象的参数。
如:用filter在HttpServletRequest对象到达Servlet之前将用户输入的空格去掉。但是由于java.util.Map包装的HttpServletRequest对象的参数是不可改变的,那要怎么办呢?
幸运的是,尽管我们不能改变对象本身,但是可以通过装饰模式来改变其状态。
比如在上文中编写的内部类Request就是HttpServletRequest类的装饰类。
该类继承的HttpServletRequestWrapper类是HttpServletRequest类的装饰类。
这在jsp/servlet 中是非常有用的,web程序通过调用httpServletRequest对象的getParameter方法来处理表单,因此通过重写装饰类中的此方法就可以改变HttpServletRequest对象的状态。所以在上题的内部类Request中就重写了getParameter方法和getParameterValues方法。
因此,想要改变在httpServletRequest中的参数,可以通过httpServletRequest的装饰类HttpServletRequestWrapper来实现,只需要在装饰类中按照需要重写其getParameter(getParameterValues)方法即可。