代码之家  ›  专栏  ›  技术社区  ›  NA.

在任何HandlerMapping之前修改HttpServletRequest?

  •  0
  • NA.  · 技术社区  · 15 年前

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

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

    接下来,我试着做一个定制的手绘。我延伸 AbstractUrlHandlerMapping

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

    4 回复  |  直到 15 年前
        1
  •  0
  •   skaffman    15 年前

    正如其他人所指出的,标准servlet过滤器可以完成这项工作,但它不是一个非常友好的spring解决方案——过滤器不是由spring管理的,因此不能与Springbean连接。过滤器需要以编程方式获取SpringBean,这并不好。

    修改现有请求的URL的问题在于它破坏了ServletAPI模型。 HttpServletRequest 有多个与路径和URL相关的方法来提取原始URL的不同部分,您必须确保以某种方式修改了所有这些值。无论您使用过滤器还是拦截器,API都不是为此而设计的。

    EntityManager . 通过让控制器处理程序方法返回 InternalResourceView 使用“新”路径。严格来说,这并不是您要转发的视图,但Spring不会知道其中的区别。或者,您可以使用直接转发 request.getRequestDispatcher(newPath).forward(request, response) .

        2
  •  1
  •   Richard    8 年前

    我意识到这是一个旧线程,但我建议您扩展org.springframework.web.servlet.DispatcherServlet

    @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);
    }   
    

    然后将web.xml中的此调度器称为:

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

        3
  •  0
  •   rodrigoap    15 年前

    可能包装servlet请求并将其传递给过滤器链。

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

        4
  •  0
  •   Bozho    15 年前

    你可以用普通的 javax.servlet.Filter 创建一个 HttpServletRequest -为您处理URL的包装器。