繁体   English   中英

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

[英]How to return Jersey MVC Viewable after authentication redirect?

TLDR:我的方法需要 2 次重定向/转发才能工作(1 次用于身份验证,1 次用于为 jsp 页面提供服务)。 如何解决重定向/转发(或使其成为非要求)以免遇到错误 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: Cannot forward after response has been commit 我对使用这个Viewable类不太了解,但是基于我在返回 String/void/其他任何东西时没有遇到该错误的事实,我假设返回一个新的 Viewable 需要做一些转发,导致用户看到jsp页面。

我已阅读有关此错误的主要SO 帖子,但我不确定如何将修复程序应用于我当前的问题。 例如,我不知道如何应用以下修复程序:

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

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

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

编辑:看起来用户被重定向到初始登录认证,但由于SSO ,认证一次后不需要再次重定向

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

  1. 检查用户是否已经通过身份验证
  2. 返回 Response 而不是 Viewable。

由于用户只需要第一次重定向进行身份验证,我可以返回一个空/无意义的响应作为占位符。 然后一旦用户通过身份验证并返回到我的应用程序,我就可以返回一个包装在 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();
    }
}

暂无
暂无

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

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