我们的应用程序要求用户登录才能查看任何内容。对所有页面的访问都被 LoginInterceptor
拦截,如果没有用户的有效 session ,它会弹出登录表单。
我希望拦截器在显示登录表单之前记住原始请求 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;
}
}
但是,由于 return "redirect"
,我得到了一个空白页面。 getSavedUrl()
从未被调用。
解决方案:
完全删除 @Results
注释,而不是 return "redirect";
调用
response.sendRedirect(savedUrl); return null;
最佳答案
如果没有登录则重定向到LOGIN
结果。然后你应该像这样重写你的拦截器
public final String intercept(final ActionInvocation invocation) throws Exception {
// before save original url
Map session = invocation.getInvocationContext().getSession();
Object action = invocation.getAction();
if (!(action instanceof LoginAction)){
String queryString = request.getQueryString();
session.put("savedUrl", request.getRequestURI()+(queryString==null?"":("?"+queryString)));
} else {
return invocation.invoke();
}
if (!processLogin(request, session)) { //return false if not authenticated
session.put("isLogin", true);
return Action.LOGIN;
} else {
savedUrl = (String) session.get("savedUrl");
boolean isLogin = (boolean)session.get("isLogin");
if (!StringUtils.isEmpty(savedUrl) && isLogin) {
session.put("isLogin", false);
return "redirect";
}
return invocation.invoke();
}
}
关于java - 从 Struts 2 中的登录拦截器重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20993574/