过滤敏感语汇1.0版——仅仅是最简单的过滤
过滤敏感词汇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
login_process.jsp
BadWordsFilter.java
BadWordsWrapper
web.xml(仅仅部分)
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 { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public 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) ; } @Override public 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 ; } @Override public 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>