[英]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 ,认证一次后不需要再次重定向
好的,基于一些初步测试,似乎以下解决方案对我有用:
由于用户只需要第一次重定向进行身份验证,我可以返回一个空/无意义的响应作为占位符。 然后一旦用户通过身份验证并返回到我的应用程序,我就可以返回一个包装在 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.