我们的应用程序要求用户登录以查看任何内容. LoginInterceptor拦截对所有页面的访问,如果用户没有有效会话,则会调出登录表单.我希望拦截器在显示登录表单之前记住原始请求URI,并在登录表单验证成功时重定向到它.我试着遵循
Struts 2 Redirect to correct action after authentication interceptor.
@Service
@Results({
@Result(name = "redirect", type = "redirect", location = "${savedUrl}")
})
public class LoginInterceptor extends AbstractInterceptor {
//...
private String savedUrl;
//...
@Override
public final String intercept(final ActionInvocation invocation) throws Exception {
// ...
savedUrl = (String) session.getAttribute("savedUrl");
// ...
if (processLogin(request, session)) { // validate login form
if (!StringUtils.isEmpty(savedUrl)) {
return "redirect";
}
return LOGIN_SUCCESS_RESULT;
}
// if there's no loginData in sesssion, remeber the URI and display a login form
String queryString = request.getQueryString();
session.setAttribute("savedUrl", request.getRequestURI() + (queryString==null ? "" : ("?" + queryString)));
return "login";
}
// ...
public String getSavedUrl(){
return savedUrl;
}
}
但是,由于返回“重定向”,我得到一个空白页面.永远不会调用getSavedUrl().
解决方案:完全刮开@Results注释,而不是返回“重定向”; call response.sendRedirect(savedUrl); return null;