gpt4 book ai didi

java - jetty 服务器配置

转载 作者:行者123 更新时间:2023-11-30 08:18:42 25 4
gpt4 key购买 nike

我使用 Jetty 9,但在配置方面遇到了一些问题。我简单的 REST 工作正常。但是当我尝试向所有请求和错误处理程序添加新 header 时,问题就开始了。我能够处理 header 的唯一方法是将此代码添加到每个响应中:

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

服务器配置:

        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 类

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

}

如何注册标题?我究竟做错了什么?我不使用WEB配置。

最佳答案

您正在将 Jersey 1.x 与 Jersey 2.x 混合使用,应该这样做。您的过滤器类基于 Jersey 1.x。您的 ResourceConfig 是 Jersey 2.x。我知道这是因为 Jersey 1.x ResourceConfig 没有 register() 方法。对于 Jersey 1.x,这就是我们注册上述过滤器的方式

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

这就足够了。但是 Jersey 2.x 没有这种添加过滤器的方式。我们需要注册一切。

话虽如此,如果您使用的是 Jersey 2.x,我强烈建议您摆脱对 Jersey 1.x 的所有依赖。这样做之后,您会注意到的第一件事是您的过滤器类将不再编译。重构后的 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");
}
}

使用上面的过滤器应该可以。

关于java - jetty 服务器配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27323432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com