案例说明:在index.jsp页面通过表单提交一段文字,跳转到Servlet01,但在跳转到Servlet01前,会先将请求交给过滤器EncodingFilter(统一编码过滤器),SensitiveWordFilter(敏感词过滤器),过滤后,再跳转到Servlet01,在控制台打印出经过滤后所提交的文字。
-index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="test" method="post">
<textarea name="txt">
</textarea>
<input type="submit" value="发送">
</form>
</body>
</html>
- EncodingFilter(统一编码过滤器)
@WebFilter("/*")
public class EncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//统一解决乱码问题
//1.解决响应的中文乱码
response.setContentType("text/html;charset=utf-8");
//2.解决请求的中文乱码:post方式
if ("POST".equalsIgnoreCase(request.getMethod())) {
request.setCharacterEncoding("utf-8");
}
//3.放行请求
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
}
}
-
sensitiveWords.txt(敏感词词库)
-
SensitiveWordFilter(敏感词过滤器)
@WebFilter(filterName="SensitiveWordFilter", urlPatterns="/*")
public class SensitiveWordFilter implements Filter {
private List<String> list=new ArrayList<>();
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest httpServletRequest= (HttpServletRequest) req;
Myreq myreq = new Myreq(httpServletRequest,list);
chain.doFilter(myreq, resp);
}
public void init(FilterConfig config) throws ServletException {
ServletContext servletContext = config.getServletContext();
InputStream resourceAsStream=null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader=null;
try {
//根据web工程下的文件资源路径,得到一个流对象
resourceAsStream = servletContext.getResourceAsStream("file/sensitiveWords.txt");
//InputStreamReader:将InputStream转换为Reader(将字节的输入流按指定字符集转换为字符的输入流),需指定编码不然会乱码
inputStreamReader = new InputStreamReader(resourceAsStream,"UTF-8");
//创建缓冲流对象:它是处理流,对节点流进行包***ufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
list.add(str);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(resourceAsStream!=null){
resourceAsStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//装饰模式
/* 创建一个装饰类,对request的getParameter方法进行增强:获取替换敏感词之后的字符串 HttpServletRequestWrapper类是HttpServletRequest的装饰类,该类并没有直接给HttpServletRequest的任何方法增强功能, 我们创建一个类继承HttpServletRequestWrapper,重写想要增强功能的方法(如:这里的getParameter,使这个方法有更多功能)。 然后我们创建这个类的对象,在chain.doFilter(myreq, resp)传到Servlet,调用getParameter则是调用的我们重写的方法。 */
class Myreq extends HttpServletRequestWrapper {
private HttpServletRequest httpServletRequest;
private List<String> list=new ArrayList<>();
// public Myreq(HttpServletRequest request) {
// super(request);
//把请求赋值给被装饰对象
// httpServletRequest=request;
// }
//
public Myreq(HttpServletRequest request,List list) {
super(request);
httpServletRequest=request;
this.list=list;
}
@Override
public String getParameter(String name) {
String txt = httpServletRequest.getParameter(name);
//当txt不为空的时候
if(txt!=null&&!txt.isEmpty()){
//分别对每一个敏感字循环一次
for (int i = 0; i <list.size() ; i++) {
//如果在txt中发现此次循环的敏感字则将其替换为"**",没有发现则不执行替换方法
if(txt.indexOf(list.get(i))!=-1) {
txt=txt.replaceAll(list.get(i), "**");
}
//也可以直接替换
// txt = txt.replace(list.get(i), "**");
}
}
return txt;
}
}
/* 1.replace与replaceAll简要介绍:replace和replaceAll是JAVA中常用的替换字符的方法。 replace:把源字符串中的某一字符或字符串 全部 换成指定的字符或字符串。 replaceAll:源字符串中的某一字符或字符串 全部 换成指定的字符或字符串,基于规则表达式的替换。 replaceFirst:只替换第一次出现的字符串,基于规则表达式的替换。 注:replaceAll()和replaceFirst()所用的参数不是基于规则表达式的,则与replace()替换字符串的效果一样。 2.indexOf(String str): 返回指定字符串str在方法调用者中第一次出现处的起始索引,如果此字符串中没有这样的字符,则返回 -1。 */
- Servlet01
@WebServlet(name = "Servlet01",urlPatterns = "/test")
public class Servlet01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String txt = request.getParameter("txt");
System.out.println("Servlet01接收的信息:"+txt);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
测试效果:
浏览器输入,发送:
Servlet01获取请求消息,控制台输出: