身份验证重定向后如何return Jersey MVC Viewable?

How to return Jersey MVC Viewable after authentication redirect?

TLDR:我的方法需要 2 个 redirects/forwards 才能工作(1 个用于身份验证,1 个用于 jsp 页面)。我如何解决 redirects/forwards (或使其成为非要求),以免 运行 进入错误,java.lang.IllegalStateException:提交响应后无法转发。

更多上下文:

我有一个 java servlet,其方法如下所示:

@GET
@Path("/test")
@Authenticate
public Viewable test(@Context HttpServletRequest request, @Context HttpServletResponse response) {
    Map<String, Object> model = createModel();
    return new Viewable("/somePath/jspFile", model);
}

@Authenticate 注释拦截执行某些 Open ID Connect 类型身份验证的调用,这导致用户被转发到不同的服务器以满足所有身份验证需求。如果用户通过身份验证,他们将被重定向回我的应用程序。

但是,当点击此方法的 url 时,我得到 java.lang.IllegalStateException:提交响应后无法转发 。我不太了解如何使用 Viewable class,但基于我在返回 String/void/whatever 时不会 运行 进入该错误的事实,我假设返回一个新的 Viewable 需要做一些转发,导致用户看到 jsp 页面。

我已经阅读了主要内容 SO post about this error,但我不确定如何将修复应用到我当前的问题。例如,我不知道如何应用类似以下修复的内容:

protected void doPost() {
    if (someCondition) {
        sendRedirect();
    } else {
        forward();
    }
}

修复假定我可以重定向或转发,但我当前的方法需要重定向以进行身份​​验证和 forward/redirect 来为 jsp 页面提供服务。也许我遗漏了一个明显的修复程序,它不需要完全修改当前代码?

编辑:如果我能先检查用户是否经过身份验证就好了,但我假设使用这个注释会自动需要初始重定向

编辑:好像是初次登录认证跳转,但是由于SSO

认证一次后不需要再次跳转

好的,根据一些初步测试,似乎以下解决方案对我有用:

  1. 检查用户是否已通过身份验证
  2. Return 响应而不是可见。

由于用户只需要在第一次进行身份验证时被重定向,我可以 return 一个 empty/meaningless 响应作为占位符。然后,一旦用户通过身份验证并 return 进入我的应用程序,我就可以 return 一个包含在 Response 对象中的 Viewable。

因此代码将如下所示:

@GET
@Path("/test")
@Authenticate
public Response test(@Context HttpServletRequest request, @Context HttpServletResponse 
response) {
    Map<String, Object> model = createModel();
    if (userIsAuthenticated()) {
        return Response.status(401).build();
    } else {
        return Response.ok(new Viewable("/somePath/jspFile", model)).build();
    }
}