场景:
在做一个过滤器过滤非法字符时,采用了一个简单的例子来验证其功能,发现怎么也过不了
这是TEST类
package web.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String msg = request.getParameter("msg");
System.out.println(name + ":" +msg);
}
}
直接在网页上请求
最终结果就是好多资源无法访问
原因分析:
先看代码,主要是这个方法出问题了
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
// //创建代理对象,增强getParameter方法
ServletRequest proxy_req=(ServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), response.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("getParameter")){
//增强返回值
//获取返回值
String value = (String) method.invoke(request, args);
if(value!=null){
for(String str : list){
if(value.contains(str)){
value = value.replaceAll(str,"***");
}
}
}
return value;
}
return method.invoke(request,args);
}
});
chain.doFilter(proxy_req, response);
}
解决方案:
最终试了半天,才发现是 Proxy.newProxyInstance这个方法中的参数出问题了,实现接口那写得是response,不是request了
这回又搜了一下newProxyInstance这个方法
https://blog.csdn.net/u012326462/article/details/81293186
newProxyInstance,方法有三个参数:
loader: 用哪个类加载器去加载代理对象
interfaces:动态代理类需要实现的接口
h:动态代理方法在执行时,会调用h里面的invoke方法去执行
总结一下,我是做加强参数这个功能,不能出现违规言语,利用request中的参数做了一个实验,应该是要去“修改”request中的功能,应该用的是request这个类加载器,和request的接口