【问题标题】:How to resolve Jetty AbstractHandler not sending the request to the next如何解决 Jetty AbstractHandler 不将请求发送到下一个
【发布时间】:2021-09-25 19:24:20
【问题描述】:

我正在做一个项目,我们将使用 Jetty AbstractHandler 拦截所有请求以进行验证。

以下是基本的处理程序声明:

public class HandlerClass extends AbstractHandler
{
    @Override
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException
    {
        String requestURI = request.getRequestURI();
        LOG.debug("Request Handler received");
        try
            {
                if (!getStatus())
                {
                    response.setContentType(MediaType.APPLICATION_JSON);
                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                    response.setCharacterEncoding(StandardCharsets.UTF_8.name());

                    ErrorBuilder errorBuilder = new ErrorBuilder();
                    Schema schema = errorBuilder.getErrorInstance(Status.FORBIDDEN.getStatusCode(), "forbidden", "Authorization failed", "Request not allowed.");
                    String responseData = new Gson().toJson(schema);
                    response.getOutputStream().print(responseData);
                    response.flushBuffer();
                    baseRequest.setHandled(true);
                }
            }
            catch (Exception e)
            {
                System.out.print(e);
            }
    }
}

下面是jetty.xml的绑定:

<Set name="handler">
    <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
      <Set name="handlers">
       <Array type="org.eclipse.jetty.server.Handler">
         <Item>
           <New class="handlers.HandlerClass"/>
         </Item>
       </Array>
      </Set>
    </New>
  </Set>

我可以看到所有请求都在处理程序方法中进行拦截,但如果getStatus() 返回 true,则请求不会从处理程序转到下一个处理程序。 如果getStatus() 返回 false,那么我可以根据我的代码看到错误响应。

我不确定我在哪里做错了,或者我错过了什么配置,因为在getStatus() 返回 true 的情况下哪个请求没有来自处理程序类。

注意:“getStatus()”是一种自定义方法,在某些条件下返回真或假。

【问题讨论】:

  • 什么是getStatus()?这不是 Jetty 的 AbstractHandler 上的方法。
  • @Joakim 不,这是一个自定义方法,在某些条件下返回真或假。

标签: java jetty handler jetty-9


【解决方案1】:

当你打电话时

baseRequest.setHandled(true);

这意味着请求已被处理,后续的处理程序(无论它们出现在处理程序树中的什么位置)都不会被该请求调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多