Jersey 嵌入式Jetty:如何在http请求到达时立即运行安全处理程序?

Jersey 嵌入式Jetty:如何在http请求到达时立即运行安全处理程序?,jersey,jetty,embedded-jetty,Jersey,Jetty,Embedded Jetty,我正在使用嵌入式码头和泽西。我的问题是:有没有可能在HTTP请求到达Jersey类之前使jetty的SecurityHandler生效 这是我的代码:(很抱歉可能太多了。) jetty服务器初始化的类: 公共类JettyHttpComponent扩展了AbstractLifeCycleComponent{ 私有静态最终字符串REST\u SOURCE\u KEY=“jersey.config.server.provider.classnames”; //TODO安全配置与实现 public in

我正在使用嵌入式码头和泽西。我的问题是:有没有可能在HTTP请求到达Jersey类之前使jetty的
SecurityHandler
生效

这是我的代码:(很抱歉可能太多了。) jetty服务器初始化的类:

公共类JettyHttpComponent扩展了AbstractLifeCycleComponent{
私有静态最终字符串REST\u SOURCE\u KEY=“jersey.config.server.provider.classnames”;
//TODO安全配置与实现
public int start()引发运行时异常{
服务器jettyServer=新服务器(8080);
ServletContextHandler context=new ServletContextHandler(jettyServer,“/”,ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY);
context.setContextPath(“/”);
setSecurityHandler(basicAuth());
ServletHolder jerseyServlet=context.addServlet(
org.glassfish.jersey.servlet.ServletContainer.class“/*”;
jerseyServlet.setInitOrder(0);
//加载rest资源
setInitParameter(REST_SOURCE_KEY,IndexService.class.getCanonicalName());
试一试{
jettyServer.start();
jettyServer.join();
}捕获(例外e){
e、 printStackTrace();
}最后{
jettyServer.destroy();
}
返回0;
}
public int stop()引发RuntimeException{
//密切资源
试一试{
close();
}捕获(IOE异常){
抛出新的运行时异常(e);
}
System.out.println(“服务器停止”);
返回0;
}
私有SecurityHandler basicAuth(){
ConstraintSecurityHandler securityHandler=新的ConstraintSecurityHandler();
LoginService LoginService=新的LDAPLoginService();
securityHandler.setLoginService(loginService);
返回securityHandler;
}
}
basicAuth()
中的
LDAPLoginService
类是我的自定义登录类,它扩展了
AbstractLoginService

处理http请求的Jersey类:

@Path(“/index”)
公共类IndexService扩展了BaseRestService{
@放
@使用(MediaType.APPLICATION_JSON)
@产生(MediaType.APPLICATION_JSON)
公共响应索引(@Context SecurityContext SecurityContext,
@上下文HttpHeaders,
@上下文HttpServletRequest httpRequest,
@QueryParam(“算法”)字符串算法,
@QueryParam(“executionMode”)字符串模式,
字符串请求){
long t1=System.currentTimeMillis();
字符串响应=null;
IndexContext上下文=null;
试一试{
init();
//设置包含安全性、标题、选项和请求的上下文
ServiceUserContext suc=buildServiceUserContext(securityContext,httpRequest);
如果(suc==null){
返回Response.status(status.UNAUTHORIZED).entity(Response.build();
}
ServiceDataContext sdc=buildServiceDataContext(请求);
context=IndexContext.builder().algorithm(algorithm).serviceDataContext(sdc)。
serviceUserContext(suc.build();
//将服务分派到与核心服务匹配的实体
调度(上下文);
}捕获(可丢弃的t){
handlerErrors(t,上下文);
}最后{
if(上下文!=null){
密切(上下文);
response=context.getServiceDataContext().getResponse();
System.out.println(“索引取值:”+(System.currentTimeMillis()-t1)+“ms”);
}
}
返回Response.status(status.OK).entity(Response.build();
}   
}

在方法
buildServiceDataContext()
中,我调用了
securityContext.getUserPrincipal()
,并且
LDAPLoginService
类扩展
AbstractLoginService
在到达
securityContext.getUserPrincipal()
之前不会执行任何操作。是否可以在一开始就运行安全检查,甚至在Jersey类开始处理请求之前?谢谢。

正如@Paul Samsotha建议的那样,
ContainerRequestFilter
是一个不错的选择