身份验证重定向后如何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
认证一次后不需要再次跳转
好的,根据一些初步测试,似乎以下解决方案对我有用:
- 检查用户是否已通过身份验证
- 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();
}
}
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
认证一次后不需要再次跳转好的,根据一些初步测试,似乎以下解决方案对我有用:
- 检查用户是否已通过身份验证
- 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();
}
}