我可以在Java Servlet过滤器中拦截和更改HTTPServletRequest的请求URL吗?

时间:2009-08-29 11:39:49

标签: java servlets

我有一个Java Web应用程序,可管理许多俱乐部的数据。我希望应用程序根据输入的URL显示俱乐部信息。

EG。如果输入“localhost:8080 / MyApp / Club1” ...然后应用程序应该删除请求URL(Club1)的结尾,在俱乐部的数据库中进行查找,并将其添加到会话中。然后,所有数据库请求都可以根据会话中的哪个俱乐部查找数据。

如果您输入“localhost:8080 / MyApp / Club2”,您可以在会话中注册俱乐部,并且所有数据库请求都是针对俱乐部2的。

我认为我可以这样做的方法是使用调用HTTPServletRequest()。getRequestURL()的servlet过滤器,并从请求URL中删除俱乐部名称,从数据库中查找俱乐部。

但是我不想将请求URL更改为http://localhost:8080/MyApp,以便应用程序正常工作。但是,我认为我无法做到这一点?

任何有关如何做到这一点的想法,或者是否有更好的方法?

4 个答案:

答案 0 :(得分:2)

我不认为过滤器是正确的方法。您所描述的基于俱乐部会员资格改变行为的内容是属于您的服务层内的逻辑,可以在其中重复使用。

更好的方法是忘记过滤器并只编写servlet。将俱乐部名称作为参数传递,使用它在该俱乐部的URL地图中进行查找,并让您的servlet使用RequestDispatcher重定向到该俱乐部的URL。我没有看到过早使用过滤器拦截心跳的任何好处。

如果你使用的是Spring,我建议把它放到你的服务中,让web MVC层处理请求的映射和路由。

这是其中一种情况,即如果做你想做的事情太困难和困惑,你可能会尝试错误的事情。有更简单的方法可以做到这一点,过滤器甚至不是很接近。

答案 1 :(得分:1)

看看urlrewritefilter。它是一个servlet过滤器,可以在servlet看到它之前修改请求URL。它通常用于将查询参数转换为路径参数或从路径参数转换查询参数。

如果你谷歌的话,你会看到它出现在一些相当高调的java应用程序的堆栈痕迹中:)

答案 2 :(得分:0)

Core J2EE Patterns - Intercepting Filter

  

摘要:创建可插入的过滤器   处理标准中的公共服务   方式无需改变   核心请求处理代码。该   过滤器拦截传入的请求   和传出的回应,允许   预处理和后处理。我们   能够添加和删除这些   不显眼地过滤,没有   要求改变我们现有的   代码。

答案 3 :(得分:0)

在servlet的do_GET / do_POST中,您可以将URI的第一部分解释为俱乐部,将其添加到会话中(使用应用程序范围),如果它尚未存在,则委托给其他代码只查看URI的其余部分并在适当的时候使用会话中的俱乐部。