简体   繁体   English

Jetty服务器配置

[英]Jetty server configuration

I use Jetty 9 and have some problems with configuration. 我使用Jetty 9,并且在配置方面存在一些问题。 I simple RESTs works fine. 我简单的REST正常工作。 But the problem begun when I tried to add new headers to all requests and error handler. 但是,当我尝试向所有请求和错误处理程序中添加新标头时,问题就开始了。 Only way I am able to handle headers it is by adding this code to every response: 我能够处理标头的唯一方法是将以下代码添加到每个响应中:

return Response.ok(murals)
                .header("Access-Control-Allow-Origin", "*")
                .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
                .build(); 

Server configuration: 服务器配置:

        Server server = new Server(9998);
        ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);

        servletContextHandler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class));
        servletContextHandler.addServlet(DefaultServlet.class, "/");

        ResourceConfig rc = new ResourceConfig()
                .register(FilterHeaders.class)
                .register(ExceptionNotFound.class)
                .register(CORSFilter.class); //doesnt work
        new ServletHolder(new ServletContainer(rc));

        HandlerWrapper han = new HandlerWrapper();
        han.setHandler(new AbstractHandler() {

            @Override
            public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
               request.setAttribute("welcome","Hello"); //doesn't work
            }
        });

        servletContextHandler.addFilter(Filters.class, "/*", EnumSet.of(DispatcherType.REQUEST)); //doesnt work

        ResourceHandler resourceHandler = resourceHandler();
        servletContextHandler.setHandler(resourceHandler);
        servletContextHandler.setHandler(han);
        server.start();
        server.join();

CROSFilter class CROSFilter类

 public class CORSFilter implements ContainerResponseFilter {

        @Override
        public ContainerResponse filter(ContainerRequest request,
                ContainerResponse response) {

            response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
            response.getHttpHeaders().add("Access-Control-Allow-Headers",
                    "origin, content-type, accept, authorization");
            response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
            response.getHttpHeaders().add("Access-Control-Allow-Methods",
                    "GET, POST, PUT, DELETE, OPTIONS, HEAD");

            return response;
        }

    }

How to register headers? 如何注册标题? What am I doing wrong? 我究竟做错了什么? I do not use WEB configuration. 我不使用WEB配置。

You are mixing Jersey 1.x with Jersey 2.x, which should not be done. 您正在混合球衣1.x和球衣2.x,这应该这样做。 Your filter class is based on Jersey 1.x. 您的过滤器类基于Jersey1.x。 Your ResourceConfig is Jersey 2.x. 您的ResourceConfig是Jersey2.x。 I know this because Jersey 1.x ResourceConfig doesn't have the register() method. 我知道这是因为Jersey 1.x ResourceConfig没有register()方法。 With Jersey 1.x, this is howwe would register your above filter 使用Jersey 1.x,这就是我们注册上述过滤器的方式

resourceConfig.getContainerResponseFilters().add(new CORSFilter());

And that would be enough. 这样就足够了。 But Jersey 2.x does not have this way of adding filters. 但是Jersey 2.x没有这种添加过滤器的方式。 We need to register everything. 我们需要register所有内容。

That being said, if you are using Jersey 2.x, I highly suggest getting rid of all your Jersey 1.x dependencies. 话虽如此,如果您使用的是Jersey 2.x,我强烈建议您摆脱所有Jersey 1.x依赖项。 After doing so, the first thing you will notice is that your filter class will no longer compile. 这样做之后,您会注意到的第一件事是您的过滤器类将不再编译。 Here's how the refactored 2.x filter should look like: 重构后的2.x过滤器如下所示:

import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext request,
            ContainerResponseContext response) throws IOException {
        response.getHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHeaders().add("Access-Control-Allow-Headers",
                "origin, content-type, accept, authorization");
        response.getHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHeaders().add("Access-Control-Allow-Methods",
                "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
}

Using the above filter should work. 使用上面的过滤器应该可以工作。

Similar approach as peeskillet mentioned, but I have held jetty configuration in jetty.xml in my application. 与peeskillet提到的方法类似,但是我在应用程序中的jetty.xml中保留了jetty配置。

So to add custom filters I had to register them in the jetty.xml file as: 因此,要添加自定义过滤器,我必须将它们注册在jetty.xml文件中,如下所示:

<New class="org.eclipse.jetty.servlet.ServletHolder">
<Arg>
    <New class="com.sun.jersey.spi.container.servlet.ServletContainer">
        <Arg>
            <New class="com.sun.jersey.api.core.PackagesResourceConfig">
                <Arg>
                    <Map>
                      <Entry>
                        <Item>com.sun.jersey.config.property.packages</Item>
                        <Item>...my package</Item>
                      </Entry>
                      <Entry>
                        <Item>com.sun.jersey.spi.container.ContainerResponseFilters</Item>
                        <Item>...MyCorsResponseFilter</Item>
                      </Entry>
                    </Map>
                </Arg>
            </New>
        </Arg>
    </New>
</Arg>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM