java - 从 Struts 2 中的登录拦截器重定向

标签 java authentication struts2 interceptor actionresult

我们的应用程序要求用户登录才能查看任何内容。对所有页面的访问都被 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/

相关文章:

java - 在 HSSFWorkbook 中设置 Activity 单元格

c# - ASP.NET - 检查请求是否在母版页中通过身份验证

Grails:spring security 插件 - 错误 springsecurity.GormPersistentTokenRepository

jquery-plugins - 有没有struts2 jquery渐进式文件上传插件?

java - Struts 中的向导表单

java - 在 JAX-RS Service jersey 实现中删除多个资源

java - RabbitMQ com.rabbitmq.client.AlreadyClosedException : connection is already closed due to connection error

安卓与 Django : How to keep user logged in

java - 如何使用<s :if> tag in Struts 2?

java - 作业逻辑错误。奇怪的 if 语句