10.3. 创建自定义处理程序

定义自定义处理程序的方法有两种:

使用 WEB-INF/jboss-web.xml 文件定义自定义处理程序

自定义处理程序可以在 WEB-INF/jboss-web.xml 文件中定义。

示例:在 WEB-INF/jboss-web.xml中定义自定义处理程序

<jboss-web>
    <http-handler>
        <class-name>org.jboss.example.MyHttpHandler</class-name>
    </http-handler>
</jboss-web>

示例: HttpHandler Class

package org.jboss.example;

import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;

public class MyHttpHandler implements HttpHandler {
    private HttpHandler next;

    public MyHttpHandler(HttpHandler next) {
        this.next = next;
    }

    public void handleRequest(HttpServerExchange exchange) throws Exception {
        // do something
        next.handleRequest(exchange);
    }
}

也可以使用 WEB-INF/jboss-web.xml 文件为自定义处理程序设置参数。

示例:在 WEB-INF/jboss-web.xml 中定义参数

<jboss-web>
    <http-handler>
        <class-name>org.jboss.example.MyHttpHandler</class-name>
        <param>
            <param-name>myParam</param-name>
            <param-value>foobar</param-value>
        </param>
    </http-handler>
</jboss-web>

要使这些参数发挥作用,处理程序类需要具有对应的集合器。

示例:在 Handler 中定义设置方法

package org.jboss.example;

import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;

public class MyHttpHandler implements HttpHandler {
    private HttpHandler next;
    private String myParam;

    public MyHttpHandler(HttpHandler next) {
        this.next = next;
    }

    public void setMyParam(String myParam) {
        this.myParam = myParam;
    }

    public void handleRequest(HttpServerExchange exchange) throws Exception {
        // do something, use myParam
        next.handleRequest(exchange);
    }
}

在 WEB-INF/undertow-handlers.conf 文件中定义自定义处理程序

除了使用 WEB-INF/jboss-web.xml 定义处理程序外,也可以在 WEB-INF/undertow-handlers.conf 文件中定义。

myHttpHandler(myParam='foobar')

要让 WEB-INF/undertow-handlers.conf 中定义的处理器正常工作,需要创建两个因素:

  1. HandlerBuilder 实施,它为 undertow-handlers.conf 定义对应的语法位,并负责创建 HttpHandler (封装在 HandlerWrapper 中)。

    示例: HandlerBuilder

    package org.jboss.example;
    
    import io.undertow.server.HandlerWrapper;
    import io.undertow.server.HttpHandler;
    import io.undertow.server.handlers.builder.HandlerBuilder;
    
    import java.util.Collections;
    import java.util.Map;
    import java.util.Set;
    
    public class MyHandlerBuilder implements HandlerBuilder {
        public String name() {
            return "myHttpHandler";
        }
    
        public Map<String, Class<?>> parameters() {
            return Collections.<String, Class<?>>singletonMap("myParam", String.class);
        }
    
        public Set<String> requiredParameters() {
            return Collections.emptySet();
    
        }
    
        public String defaultParameter() {
            return null;
    
        }
    
        public HandlerWrapper build(final Map<String, Object> config) {
            return new HandlerWrapper() {
                public HttpHandler wrap(HttpHandler handler) {
                    MyHttpHandler result = new MyHttpHandler(handler);
                    result.setMyParam((String) config.get("myParam"));
                    return result;
                }
            };
        }
    }

  2. 文件中的条目。META-INF/services/io.undertow.server.handlers.builder.HandlerBuilder.此文件必须位于类路径上,例如,在 WEB-INF/classes 中。

    org.jboss.example.MyHandlerBuilder