大家好,我是一名入门的菜鸟,如果你不经意间翻开了我的文章,谢谢您,您的支持是我前进的动力,让我们一起加油!!
由于不是名牌大学,只是一个普普通通的专科生,所以,我想通过自己的努力来获得我想要的,我不会放弃我的梦想,我也曾幻想着我成功的时候在朋友边吹嘘,也曾想象到我失败时候潦倒的样子,幻想始终是幻想,我会努力的,加油,你一定能行
首先,使用动态代理最重要的是要找到要增强的方法,找到目标,目标明确了才能
进行下一步,我是在过滤器中进行动态代理的
我们首先要确定一件事,就是过滤器中的request是否和Servlet里的是不是同一
个,我们既然要进行过滤敏感词汇,变成***,就得让Filter和Servlet中的request里
的 内容保持一致,也就是过滤器中进行了request域的更新,Servlet也要跟着进
行更新.
这样,就得用到了动态代理,对getParameter方法进行增强,能把从文件中读取掉
的敏感词汇和原本request域中(用户输入的值)进行对比,如果包含的有,就进行
替换,然后把更新后的值在用一个新的request接收这个返回的代理对象(也就是
返回的更改过后的值)
进行放行(这时,request域中已经更新完成,和Servlet中的request域中存的值保
持了一致)
这是文件的目录结构
我把所有的敏感词汇都存进了一个txt文件中,并放在了src目录下
下面代码展示:
Filter:
package com.aoshen.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
@WebFilter("/*")
public class Demo01Filter implements Filter {
//创建集合
private ArrayList<String>list = new ArrayList<>();
public void init(FilterConfig config) throws ServletException {
//获取文件中的敏感词汇
//首先获取文件的字节输入流对象
InputStream is = this.getClass().getClassLoader().getResourceAsStream("words.txt");
//转换成字符输入流
//因为是一次读一行,转换成字符缓冲流
try (BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));){
//循环读取
String len = null;
while ((len = br.readLine())!=null){
//添加到集合中
list.add(len);
}
System.out.println(list);
} catch (Exception e) {
e.printStackTrace();
}
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//获取提交方式
HttpServletRequest request = (HttpServletRequest) req;
String method = request.getMethod();
if(method.equals("POST")){
//设置编码
request.setCharacterEncoding("utf-8");
}
//使用动态代理进行增强
//1:创建代理对象,对getParameter进行增强
ServletRequest request1 = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//2:对getParameter方法进行增强,首先判断是否是getParameter方法
if (method.getName().equals("getParameter")) {
//3:对返回值进行增强
//req:域里面存着用户输入的数据
String value = (String) method.invoke(req, args); //这里的返回值就是用户输入的值
//4:判断是否为空
if (value != null) {
//5:不等于空,循环遍历list集合里的内容
for (String s : list) {
//6:如果用户输入的数据包含敏感词汇就替换成***
if (value.contains(s)) {
value = value.replaceAll(s, "***");
}
}
}
return value;
}
//当用户使用getParameter之外的方法时,不增强,还是原来的方法
return method.invoke(req, args);
}
});
//放行的是更新之后的request,这个request域中存的才是最新的值
chain.doFilter(request1, resp);
}
public void destroy() {
}
}
Servlet:
package com.aoshen.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(value = "/Demo01Servlet")
public class Demo01Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//获取文本框内容
String message = request.getParameter("message");
out.print(message);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
JSP:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>把敏感词汇编程***</title>
</head>
<body>
<form method="post" action="Demo01Servlet">
发贴:<input type="text" name="message"> <input type="submit" value="提交">
</form>
</body>
</html>