有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在任何HandlerMapping之前修改HttpServletRequest?

我试图解决的问题是,我想根据数据库检查所有传入的GET URL。如果数据库中存在url,则应将其传递给certein控制器。我正在使用Spring3.0

首先,我尝试创建一个interceptor并将其添加到DefaultAnnotationsHandlerMapping。原来我无法在preHandle()中修改url。计划是修改请求中的url,然后让带注释的控制器处理其余的url

接下来,我试着做一个定制的手绘。我扩展了AbstractUrlHandlerMapping并创建了自己的getHandlerInternal(),它返回一个带有控制器名称的字符串,这是有效的。但是我更喜欢一个解决方案,在这个解决方案中,我可以修改请求中的url,并让一个带注释的控制器来处理它

在写这篇文章的时候,我想也许servlet过滤器是最合适的解决方案。如果是这样,我能让Spring将EntityManager注入过滤器吗?我可以扩展哪个Spring类来简化这个过程

解决第一段中问题的最恰当方法是什么?如果是servlet过滤器,请给我一些关于如何编写它的提示


共 (4) 个答案

  1. # 1 楼答案

    您可以使用一个普通的javax.servlet.Filter并创建一个HttpServletRequest包装器来为您处理URL

  2. # 2 楼答案

    也许包装servlet请求并将其传递给过滤器链

    ...
    MyHttpServletRequestWrapper wreq = new MyHttpServletRequestWrapper(request);
    doFilter(wreq, response, chain);
    ...
    

    当被询问时,包装器返回一个修改过的URL

  3. # 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. # 4 楼答案

    我意识到这是一个老话题,但我建议你扩展组织。springframework。网状物servlet。调度员服务 比如:

    @Override
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        try {
            RequestImpl req = RequestImpl.wrapRequest(request, response);
            request = req;
            response = req.getResponse();
        } catch (Throwable t) {
            //swallow       }
        super.doDispatch(request, response);
    }   
    

    然后在你的网站上参考这个调度器。xml格式:

    <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>blah.com.MyDispatcher</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    

    等等。扩展Spring MVC的绝对核心类似乎很可怕,但如果你已经足够大了,记得在注释的黑暗时代之前,当真正的成年人仍然致力于我们都喜欢的漂亮的POJO框架时,这就是你使用Spring的方式