2014-01-08 115 views
4

我們的應用程序需要用戶登錄才能查看任何內容。訪問所有頁面被LoginInterceptor攔截,如果用戶沒有有效的會話,將彈出登錄表單。我希望攔截器在顯示登錄表單之前記住原始請求URI,並在登錄表單驗證成功時重定向到它。我試圖按照Struts 2 Redirect to correct action after authentication interceptorStruts2從登錄攔截器重定向

@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()永遠不會被調用。

解決方案:完全,而是return "redirect";通話response.sendRedirect(savedUrl); return null;

+0

你的攔截器允許瀏覽未經身份驗證嗎? –

+0

不,它不,如果你沒有登錄(沒有會話),你會被重定向到登錄表單。 –

回答

3

劃傷@Results註釋如果沒有登錄然後重定向到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(); 
    } 
} 
+0

是什麼讓你迴歸「重定向」;工作?我沒有看到與舊版本有什麼不同。我認爲註釋是不正確的。一位同事找到了我添加到我的問題中的解決方案。 –

+0

'「redirect」'是一個結果,應該使用xml配置將其配置爲基本操作類或全局配置(我在上面的鏈接中提到過)。如果你沒有看到差異,可能會使用一些diff工具? –

+0

我無法測試/使用您的版本,而無需對我們的類和邏輯進行很多更改。指出爲什麼我的原始代碼失敗會更有用。編輯:我想我知道了...我接受你的答案。 –