package com.greatest.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.HttpServletResponse;
//自定义HttpFilter方法 ,实现Filter接口
public abstract class MyFilter implements Filter {
// 用于保存FilterConfig方法
private FilterConfig fconfig;
// 不建议子类直接覆盖,若直接覆盖,可能会导致filterconfig成员变量初始化失败
@Override
public void init(FilterConfig Config) throws ServletException {
this.fconfig = Config;
init();
}
// 供子類繼承的初始化方法 可以通过getFilterConfig()方法获取FilterConfig对象
protected void init() {
// TODO Auto-generated method stub
}// 直接返回init(ServletConfig)的FilterConfig对象
public FilterConfig getFconfig() {
return fconfig;
}
@Override
public void destroy() {
}
// 原声的doFilter方法 在方法内部把ServletRequest ,ServletResponse转为了
// HttpServletRequest 和 HttpSrevletResponse 并调用了
// doFilter(ServletRequest Req, ServletResponse Resp, FilterChain Chain)
// 若编写Filter的过滤方法 不建议直接继承该方法 而建议 继承
// public abstract void doFilter(HttpServletRequest
// request,HttpServletResponse response,
// FilterChain Chain) 方法
@Override
public void doFilter(ServletRequest Req, ServletResponse Resp, FilterChain Chain)
throws IOException, ServletException {
HttpServletRequest requesr = (HttpServletRequest) Req;
HttpServletResponse response = (HttpServletResponse) Resp;
doFilter(requesr, response, Chain);
}// 抽像方法 为Http请求定制 必须实现的方法
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain Chain)
throws IOException, ServletException;
}
package com.greatest.Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class MyHttpServletRequest extends HttpServletRequestWrapper {
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
// TODO Auto-generated constructor stub
}
@Override
//增强方法 不光获取值 还要判断
public String getParameter(String name) {
String val=super.getParameter(name);
if(val!=null&&val.contains(" fuck ")){
val=val.replace("fuck", "****");
}
return val;
}
}
package com.greatest.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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Filter implementation class ContentFilter
*/
@WebFilter("/bbs.jsp")
public class ContentFilter extends MyFilter{
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
//1. 获取请求 content 参数的值
String content = request.getParameter("content");
System.out.println(request);
HttpServletRequest req = new MyHttpServletRequest(request);
//2. 把其中 fuck, shit 等字符串替换换为 ****
if(content.contains(" fuck ")){
//SerletRequest, HttpServletRequest 中并没有提供诸如 setParameter(paramName, paramValue)
//类似于这样的方法.
//目标: 改变 HttpServletRequest 的 getParameter(String) 方法的行为: 若该方法的返回值中
//包含 " fuck ", 则替换为 " **** "
//1. 若对于一个类的方法不满意, 需要进行重写, 最常见的方式是, 继承父类, 重写方法.
//若实现则需要继承 org.apache.catalina.connector.RequestFacade, 而这仅是 Tomcat
//服务器的实现, 若更换服务器, 该方案将无法使用. ×.
//2. 直接写一个 HttpServletRequest 接口的实现类: 无法实现 其中方法. ×
//3. 装饰目前的 HttpServletRequest 对象: 装饰其 getParameter 方法, 而其他方法还和其实现相同.
//创建一个类, 该类实现 HttpServletRequest 接口, 把当前 doFilter 中的 request 传入到该类中, 作为
//其成员变量, 使用该成员变量去实现接口的全部方法.
}
//3. 转到目标页面
filterChain.doFilter(req, response);
}
}
Content 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="bbs.jsp" method="post">
content:<textarea rows="5" cols="21" name="content"></textarea>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
<%@ 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>
content:${param.content }
<br><br>
method:<%=request.getMethod() %>
<br><br>
<%=request %>
</body>
</html>