Servlets/Undertow - 访问 HttpServletRequest 和 HttpServletResponse

Posted

技术标签:

【中文标题】Servlets/Undertow - 访问 HttpServletRequest 和 HttpServletResponse【英文标题】:Servlets/Undertow - Accessing HttpServletRequest and HttpServletResponse 【发布时间】:2017-12-01 01:00:52 【问题描述】:

我正在尝试创建一个简单的 undertow servlet-server,但是我在 undertow 想要实例化 servlet 时遇到了一些问题。我不一定需要使用HttpServlet,我只需要访问HttpServletRequestHttpServletResponse,这样我就可以通过myServicer 运行它们。实现这一目标的最佳方法是什么? 我当前的代码:

myServicer = ...
undertow = Undertow.builder()
    .addHttpListener(port, host)
    .setHandler(Handlers.path(Handlers.redirect("/")).addPrefixPath("/",
        Servlets.defaultContainer().addDeployment(
            Servlets.deployment()
                .setClassLoader(EmbeddedUndertowServer::class.java.classLoader)
                .setDeploymentName("myDeployment").setContextPath("/")
                .addServlets(Servlets.servlet("myServlet",
                    object : HttpServlet() 
                        override fun service(request: HttpServletRequest, response: HttpServletResponse) 
                            myServicer.service(request, response) // doesn't work
                        
                    .javaClass).addMapping("/"))
        ).apply  deploy() .start()
    ))
    .build()
undertow.start()

这不起作用,因为 undertow 只想要一个类,它会尝试实例化它。

完整代码/项目在这里:https://github.com/tipsy/javalin/pull/25/files

【问题讨论】:

【参考方案1】:

我对 Undertow 不熟悉,但通过快速查看他们的文档说它是一个应用程序服务器(也是 Web),您可以将 Servlet 和 Undertow 处理程序混合在一起。这很可能意味着您要么需要将 Handler 与 HttpServerExchange 一起使用,要么定义一个 Servlet 才能使用 HttpServletRequest 或 HttpServletResponse。

【讨论】:

我真的很想避免创建一个实际的 Servlet 类。【参考方案2】:

我得到的解决方案是创建一个“存根”servlet,将服务程序传递给它。

    val servletBuilder = Servlets.deployment()
            .setClassLoader(EmbeddedUndertowServer::class.java.getClassLoader())
            .setContextPath("/")
            .setDeploymentName("javalinDeployment")
            .addServletContextAttribute("javalin-servlet", javalinServlet)
            .addServlets(Servlets.servlet("javalinServlet", UndertowServlet::class.java).addMapping("/"))
    val manager = Servlets.defaultContainer().addDeployment(servletBuilder)
    manager.deploy()
    val httpHandler = manager.start()
    val path = Handlers.path(Handlers.redirect("/")).addPrefixPath("/", httpHandler)
    this.undertow = Undertow.builder().addHttpListener(port, host).setHandler(path).build()
    undertow.start()

然后可以在每个 servlet 初始化阶段加载服务程序:

private var javalinServlet: JavalinServlet? = null

@Throws(ServletException::class)
override fun init(config: ServletConfig) 
    this.config = config
    javalinServlet = config.servletContext.getAttribute("javalin-servlet") as JavalinServlet

您可以在此处查看更改:https://github.com/osmundf/javalin-undertow/commit/30487196f2dd7a44d3ef524f642040a7330caf4e

【讨论】:

以上是关于Servlets/Undertow - 访问 HttpServletRequest 和 HttpServletResponse的主要内容,如果未能解决你的问题,请参考以下文章

客户端访问服务器的高可用性

django允许外部访问

在 LAMP (Ubuntu 11) 上设置虚拟主机返回 403

访问 Twilio MMS 图像

如何使用 gmail api 获取访问令牌

从另一个文件访问函数