【问题标题】:The indestructibles - HTTP Parameters坚不可摧 - HTTP 参数
【发布时间】:2009-06-03 20:10:15
【问题描述】:

我一直想知道为什么 Servlet API 中没有 removeParameters() 方法。 这种设计背后的动机是什么? 这是一个场景:我在不得不使用的专有 MVC 框架中面临挑战。这个框架使用一个控制器 Servlet,它在它的 post 方法中托管一个算法:

doPost() {
//create instance of action - just like struts action
action.init
action.preexecution
if(redirection state is not set)
action.process
action.postprocess
action.finish
}

我可以跳过任何特定操作的唯一方法是设置重定向 URL。控制器 Servlet 是最终的。现在,当我从动作的预执行方法中执行 requestdispatcher.forward 时,控制器将继续执行其余的方法,而不是跳过其余的方法。我无法更改此行为,也无法设置重定向,因为我需要进行转发。只要我不将请求转发到相同的操作,它就可以正常工作。当一个请求转发到同一个action时,http参数都是一样的。这将使它进入一个永无止境的循环。因此,我不得不添加额外的参数,表明这是一个重复请求,应该区别对待。 不确定我的问题是否有意义,但认为这是一个发布相同问题的好论坛。

【问题讨论】:

  • 有一种情况我希望有一个 removeParameter 选择。有时我想获取一个密码参数,对其进行哈希处理,然后立即隐藏/删除/销毁对原始密码的任何引用,以免我不小心记录它或以后暴露它。我不知道有什么办法。

标签: java servlets


【解决方案1】:

嗯...因为它没有任何用处?请求参数由客户端发送到服务器。服务器可以随意忽略它们,但是您希望这样的removeParameter() 方法有什么实际效果呢?

编辑:请求参数用于服务器和客户端之间的通信。对于服务器内部通信,可以使用请求属性,可以是setremoved

【讨论】:

  • 编辑了我的帖子,提供了可以回答您问题的更多信息
【解决方案2】:

编辑:McDowell 让我想起了 HttpServletRequestWrapper,所以我正在更改以下内容以减少工作量...谢谢 McD!

您可以修饰请求以“隐藏”您不想要的参数和/或添加额外的参数。

类似的东西(在我脑海中——没有编译,所以 API 可能是一个调整...)

public class MyParameterHider extends HttpServletRequestWrapper {
    public MyParameterHider(HttpServletRequest request) {
        super(request);
    }
    public String getParameter(String name) {
       if ("parameterToHide".equals(name))
           return null;
       return realRequest.getParameter(name);
    }
    // similar for getParameterNames and getParameterMap - don't include the hidden parm
    // all other methods are strictly pass-through and are automatically
    //   handled by HttpServletRequestWrapper
}

在您的转发中,只需在调用 doFilter 时将请求包装在 ParameterHider 中:

dispatcher.forward(new MyParameterHider(request), response);

模式 FTW!

希望这会有所帮助!

【讨论】:

  • 这是解决问题的好方法!
  • 谢谢,很高兴为您提供帮助!碰巧我过去不得不做类似的事情;)
  • 如果可能的话,最好扩展 HttpServletRequestWrapper - 该接口在过去已经改变,实现的会更少。
  • @McD @Scott - 谢谢你的回复。他们很有帮助。
猜你喜欢
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多