在 servlet 中以编程方式调用过滤器(使用码头/火花创建)?

Posted

技术标签:

【中文标题】在 servlet 中以编程方式调用过滤器(使用码头/火花创建)?【英文标题】:Invoking filter programmatically inside servlet (Created using jetty/spark)? 【发布时间】:2012-02-22 06:34:51 【问题描述】:

我正在尝试使用 spark 微框架 (http://www.sparkjava.com/readme.html) 创建一个轻量级、独立的 Web 服务。我需要处理多部分表单(我想同时接收文件和一些键值数据)。

Jetty(Spark 所依赖的)提供了一个MultiPartFilter 过滤器,它有助于处理多部分数据,但我不明白如何在我的代码中挂钩。

我需要以编程方式执行此操作,因为此服务不会作为大型 java 安装的一部分部署,而是用于支持 python 应用程序。

我的代码是这样的:

public class Transcoder 

    static Base64 base64 = new Base64();

    public static void main(String[] args) 

        org.apache.log4j.BasicConfigurator.configure();

        post(new Route("/convert") 
            @Override
            public Object handle(Request request, Response response) /*throws Exception, Docx4JException*/

                //I want to do something like this:
                new_request = new MultiPartFilter().process_my_request(request);
                /* work with altered request*/
        );

    


这可能吗?

【问题讨论】:

我无法理解您为什么要以编程方式调用过滤器。将功能重构为可以由过滤器和您的非 Web 应用程序代码调用的非过滤器类不是更有意义吗? @DaveNewton:正如问题中提到的,我没有创建过滤器。我宁愿按原样使用代码,也不愿了解其内部结构,然后重构为非过滤器。 我不知道这怎么可能;它们不返回响应,它们依赖于过滤器链等。重构功能位比设置请求处理链更容易。 【参考方案1】:

我没有加载 Jetty(或 Spark)的源代码,但我只是查看 Spring 源代码并找到了一个名为 MultipartResolver 的接口,它有一个方法 resolveMultipart,看起来可以你想要/需要什么。如果在 Jetty 中找到实现类似命名接口的类,我不会感到惊讶:

public interface MultipartResolver 
 /* Parse the given HTTP request into multipart files and parameters,
 * and wrap the request inside a
 * @link org.springframework.web.multipart.MultipartHttpServletRequest object
 * that provides access to file descriptors and makes contained
 * parameters accessible via the standard ServletRequest methods.
 * ....
 */
 MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;

请注意,Commons-FileUpload 包还提供了一组很好的实用程序来执行您想要的相同类型的进程,而无需重新处理 Jetty 过滤器。

【讨论】:

谢谢!只是我需要进入 Java 的信息,完成工作,然后再次退出;)

以上是关于在 servlet 中以编程方式调用过滤器(使用码头/火花创建)?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式添加 servlet 过滤器?

在 SWIFT 2.x 中以编程方式使用 NavigationController 调用 UIViewController

在 Unity 游戏中以编程方式调用分享魅力

在 TableViewHeader 中以编程方式调用 IBAction

在coffeescript中以编程方式/“按字符串”调用函数[重复]

在 python 中以编程方式为 SOAP 端点调用 RPC 方法