当前位置: 首页 > 面试题库 >

Java使用servlet过滤器修改请求参数

柴阳云
2023-03-14
问题内容

现有的Web应用程序正在Tomcat 4.1上运行。页面存在XSS问题,但是我无法修改源代码。我决定编写一个servlet过滤器以在页面看到参数之前对其进行清理。

我想这样编写一个Filter类:

import java.io.*;
import javax.servlet.*;

public final class XssFilter implements Filter {

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException
  {
    String badValue = request.getParameter("dangerousParamName");
    String goodValue = sanitize(badValue);
    request.setParameter("dangerousParamName", goodValue);
    chain.doFilter(request, response);
  }

  public void destroy() {
  }

  public void init(FilterConfig filterConfig) {
  }
}

但是ServletRequest.setParameter不存在。

在将请求向下传递之前,如何更改请求参数的值?


问题答案:

如前所述HttpServletRequest,没有setParameter方法。这是故意的,因为该类表示来自客户端的请求,而修改参数将不表示该请求。

一种解决方案是使用HttpServletRequestWrapper类,该类使你可以将一个请求与另一个请求包装在一起。你可以对其进行子类化,并重写该getParameter方法以返回经过清理的值。然后,你可以将该包装的请求传递给chain.doFilter而不是原始请求。

这有点丑陋,但这就是servlet API所说的。如果你尝试将其他任何内容传递给doFilter,则某些servlet容器会抱怨你违反了规范,并拒绝处理它。

一个更好的解决方案是更多的工作-修改处理该参数的原始servlet / JSP,以便它期望使用请求属性而不是参数。过滤器检查参数,将其净化,然后使用request.setAttribute净化值设置属性(使用)。没有子类,没有欺骗,但确实需要你修改应用程序的其他部分。



 类似资料:
  • 问题内容: 如何使用Servlet过滤器来更改来自的传入Servlet请求网址 至 ? 问题答案: 实施。 在方法中,将传入内容强制转换为。 用抢的路径。 使用简单的方法,如,,c等提取感兴趣的部分,构成了新的路径。 使用或然后将请求/响应转发到新的URL(服务器端重定向,不反映在浏览器地址栏中),或将传入的内容强制转换为然后将响应重定向到新的URL(客户端重定向,反映在浏览器地址栏)。 注册过滤

  • 在检查完成之前,我是否必须在包装器中捕获一些东西以防止响应发送到客户机?

  • 我需要执行修改后的请求,但我有一个问题,我不能很好地理解。在尝试使用代码之前,我用Postman和request测试了api调用,如下所示: 下面是我的android代码: 编辑请求: null

  • 问题内容: Servlet和Filter有什么区别?您建议使用什么来授权页面? 问题答案: 当你要根据特定条件过滤和/或修改请求时,请使用。使用时要控制,预处理和/或后处理请求。 在Java EE的教程中提到有关筛选如下: 筛选器是可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于,过滤器本身通常不会创建响应。相反,过滤器提供的功能可以“附加”到任何类型的Web资源。

  • 自1.14.0开始,zuul网关支持动态修改请求参数。即在网关修改客户端传递过来的参数,然后发送到微服务端。 客户端参数{"name": "jim"} --> zuul中修改为{"name": "Lucy"} --> 微服务端将收到{"name": "Lucy"} 使用场景:客户端请求参数经过加密,在网关解密后,再次发送明文参数给微服务端 如何使用 在网关springboot启动函数中添加如下代

  • 这可能起作用,但由于某种原因,数据基本上是空的。我猜原因是因为过滤器不起作用。 我不太清楚如何包装Servlet过滤器,因为它们与Jersey ContainerRequestFilter期望不同的输入和输出。JerseyConfig中的以下实现似乎什么也不做,因为日志没有指示筛选器正在注册,而且在调试模式下不能中断这些文件中的行。