首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

过滤敏感语汇1.0版——仅仅是最简单的过滤

2012-12-20 
过滤敏感词汇1.0版——仅仅是最简单的过滤1)比如:fuck, shit, bitch 等其中出现任何一个要-- ****2). reque

过滤敏感词汇1.0版——仅仅是最简单的过滤

   1)比如:fuck, shit, bitch 等其中出现任何一个要--> ****
   2). request 中的 paramsters 不能修改! 所以无法替换
    3). 基本思路:
> 重写 request 的 getParameter() 方法

      * 调用父类的 getParameter() 方法获取字段的值

      * 比较该值是否为不雅词汇, 若为不雅词汇则, 返回 ****

     * 若不是不雅词汇, 正常返回.

   4). 自实现 HttpServletRequest 接口. 失败, 因为自实现的 HttpServletRequest 接口的 getParameter() 方法中, 无法获取字段值. 

   5). 继承 . 失败, 因为通过继承实现的 MyRequestFacade 的构造器中必须有一个 Request 类型的参数, 而我们无法创建该对象.

   6). 思想: 可以吧 4) 和 5) 结合起来

> 实现接口.

> 创建一个带参数的构造器  MyHttpServletRequest(HttpServletRequest request); 为该构造器传入真正的 HttpServletRequest 对象.把该对象赋给 MyHttpServletRequest 类的 HttpServletRequest 类型的成员变量, 使用该成员变量实现接口的方法!
    
         > 该思想同 GenericServlet 实现 ServletConfig 接口

    注意,在代码实现的时候并不是使用6)的方式,而是使用HttpServletRequest 的包装类-->HttpServletRequestWrapper

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><form action="login_process.jsp" method="post">Title:<input type="text" name="title"/><br><br>Desc:<textarea name="desc" rows="10" cols="21"></textarea><br><br><input type="submit" value="Submit"/></form></body></html>


login_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8" session="false"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>Title: <%=request.getParameter("title") %><br><br>Desc: <%=request.getParameter("desc") %><br><br></body></html>


BadWordsFilter.java

package com.syh.filter;import java.io.IOException;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.HttpServletRequestWrapper;public class BadWordsFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req ;//HttpServletRequestWrapper 是 HttpServletRequest 的一个包装类/* 问题:这里为什么要使用包装类呢?(以HttpServletRequest为例)  因为在这个Demo中,我们要过滤敏感词汇,肯定要从 request.getParameter("...") 这个方法中获取页面上输入的内容信息!  因此,只要拿到内容信息,进而判断,然后再用request.setParameter("...")方法替换掉敏感词汇就可以了!  可是问题马上就出现了!在 HttpServletRequest中有 setParameter("...")这个方法吗?--->没有!  不过有 setAttribute()这个方法,可是与我们所希望的没有关系,所以就使用这个 HttpServletRequestWrapper 包装类  至于中间探讨的过程就不用细说了(也没有必要),这里说一点如果我们实现 HttpServletRequest接口,是要将里面的方法全部重写的!可是我们知道如何重写吗?  虽然我们知道我们最终的目标是如何实现的就是重写 getParameter("..."), 可是这个接口中还有其他的方法啊!你知道怎么写吗?即使知道,那是不是也太麻烦了!  所以使用这个包装类,在包装类中实现了HttpServletRequest所有方法,不过一定要记住这是一个类,而不是接口,所以可用继承的方式  进而再覆盖父类中的 getParameter("...") 方法,最后达到我们的目的 */HttpServletRequestWrapper request2 = new BadWordsWrapper(request) ;chain.doFilter(request2, resp) ;}@Overridepublic void destroy() {}}


BadWordsWrapper

package com.syh.filter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class BadWordsWrapper extends HttpServletRequestWrapper {private HttpServletRequest request ;public BadWordsWrapper(HttpServletRequest request) {super(request);this.request = request ;}@Overridepublic String getParameter(String name) {// * 调用父类的 getParameter() 方法获取字段的值String title = request.getParameter(name) ;// * 比较该值是否为不雅词汇, 若为不雅词汇则, 返回 ****if("fuck".equals(title)) {return "****";}// * 若不是不雅词汇, 正常返回.return title ;}}


web.xml(仅仅部分)

<filter>  <filter-name>BadWordsFilter</filter-name>  <filter-class>com.syh.filter.BadWordsFilter</filter-class>  </filter>    <filter-mapping>  <filter-name>BadWordsFilter</filter-name>  <url-pattern>/login_process.jsp</url-pattern>  </filter-mapping>

热点排行