java在任何HandlerMapping之前修改HttpServletRequest?
我试图解决的问题是,我想根据数据库检查所有传入的GET URL。如果数据库中存在url,则应将其传递给certein控制器。我正在使用Spring3.0
首先,我尝试创建一个interceptor并将其添加到DefaultAnnotationsHandlerMapping。原来我无法在preHandle()中修改url。计划是修改请求中的url,然后让带注释的控制器处理其余的url
接下来,我试着做一个定制的手绘。我扩展了AbstractUrlHandlerMapping并创建了自己的getHandlerInternal(),它返回一个带有控制器名称的字符串,这是有效的。但是我更喜欢一个解决方案,在这个解决方案中,我可以修改请求中的url,并让一个带注释的控制器来处理它
在写这篇文章的时候,我想也许servlet过滤器是最合适的解决方案。如果是这样,我能让Spring将EntityManager注入过滤器吗?我可以扩展哪个Spring类来简化这个过程
解决第一段中问题的最恰当方法是什么?如果是servlet过滤器,请给我一些关于如何编写它的提示
# 1 楼答案
您可以使用一个普通的
javax.servlet.Filter
并创建一个HttpServletRequest
包装器来为您处理URL# 2 楼答案
也许包装servlet请求并将其传递给过滤器链
当被询问时,包装器返回一个修改过的URL
# 3 楼答案
正如其他人所指出的,一个标准的servlet过滤器可以完成这项工作,但它不是一个非常适合spring的解决方案——过滤器不是由spring管理的,因此不能与spring Bean连接。过滤器需要以编程方式获取SpringBean,这并不好
修改现有请求的URL的问题在于它破坏了servlet API模型
HttpServletRequest
有多个与路径和URL相关的方法,可以提取原始URL的不同部分,您必须确保以某种方式修改了所有这些值。不管是使用过滤器还是拦截器,API都不是为此而设计的因此,我的建议不是试图破坏API,而是编写一个Spring控制器,它接受“旧”路径,并根据注入的
EntityManager
将请求转发到“新”路径。通过让控制器处理程序方法返回带有“new”路径的InternalResourceView
,可以实现转发。严格来说,这并不是你要转发的观点,但Spring不会知道其中的区别。或者,您可以直接使用request.getRequestDispatcher(newPath).forward(request, response)
转发它# 4 楼答案
我意识到这是一个老话题,但我建议你扩展组织。springframework。网状物servlet。调度员服务 比如:
然后在你的网站上参考这个调度器。xml格式:
等等。扩展Spring MVC的绝对核心类似乎很可怕,但如果你已经足够大了,记得在注释的黑暗时代之前,当真正的成年人仍然致力于我们都喜欢的漂亮的POJO框架时,这就是你使用Spring的方式