2013-12-08 70 views
0

我不能阻止用戶訪問頁面時說welcome.jsp,當他不在會話中時,請幫我實施登錄攔截器。這是我的代碼。我想要做的就是當用戶用他的用戶ID登錄時,檢查他是否在會話中,如果他在會話中,讓他訪問任何其他資源,將用戶重定向到「somePage」。 TIAStruts2登錄攔截器無法正常工作

<?xml version="1.0" encoding="UTF-8" ?> 

<constant name="struts.convention.default.parent.package" 
    value="default" /> 
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
<constant name="struts.custom.i18n.resources" value="global" /> 
<constant name="struts.objectFactory" 
    value="org.apache.struts2.spring.StrutsSpringObjectFactory" /> 
<constant name="struts.i18n.reload" value="false" /> 
<constant name="struts.configuration.xml.reload" value="false" /> 

<package name="default" namespace="/default" extends="json-default,struts-default"> 

    <interceptors> 
     <interceptor name="authentication" 
      class="com.mycompany.abc.webapp.action.AuthenticationInterceptor" /> 
     <interceptor-stack name="authStack"> 
      <interceptor-ref name="authentication"></interceptor-ref> 
      <interceptor-ref name="defaultStack"></interceptor-ref> 
     </interceptor-stack> 

      /> --> 
     <interceptor-stack name="acc-stack"> 
      <!-- <interceptor-ref name="sessionCheck" /> --> 

      <interceptor-ref name="json"> 
       <param name="enableSMD">true</param> 
      </interceptor-ref> 
      <interceptor-ref name="exception" /> 
      <interceptor-ref name="alias" /> 
      <interceptor-ref name="servletConfig" /> 
      <interceptor-ref name="i18n" /> 
      <interceptor-ref name="prepare" /> 
      <interceptor-ref name="chain" /> 
      <interceptor-ref name="debugging" /> 
      <interceptor-ref name="scopedModelDriven" /> 
      <interceptor-ref name="modelDriven" /> 
      <interceptor-ref name="fileUpload" /> 
      <interceptor-ref name="checkbox" /> 
      <interceptor-ref name="multiselect" /> 
      <interceptor-ref name="staticParams" /> 
      <interceptor-ref name="actionMappingParams" /> 
      <interceptor-ref name="params"> 
       <param name="excludeParams">dojo\..*,^struts\..*</param> 
      </interceptor-ref> 
      <interceptor-ref name="conversionError" /> 
      <interceptor-ref name="workflow"> 
       <param name="excludeMethods">input,back,cancel,browse</param> 
      </interceptor-ref> 
      <interceptor-ref name="timer" /> 
     </interceptor-stack> 
    </interceptors> 

    <default-interceptor-ref name="authStack"></default-interceptor-ref> 

     <global-results> 
     <result name="login" type="redirect">/home.action</result> 
     </global-results> 
    <action name="home"> 
     <interceptor-ref name="defaultStack"></interceptor-ref> 
     <result name="somePage">/jsp/somePage.jsp</result> 
     <result name="success">/jsp/xyz.jsp</result> 
      <result name="homePage">/jsp/homePage.jsp</result> 
    </action> 
<!-- <action class="com.mycompany.abc.webapp.action.LoginAction" name="login"> 
     <interceptor-ref name="defaultStack"></interceptor-ref> 
     <result name="success">/jsp/welcome.jsp</result> 
     <result name="somePage">/jsp/somePage.jsp</result> 
    </action> 

    <action name="welcome" class="com.mycompany.abc.webapp.action.WelcomeAction"> 
    <interceptor-ref name="defaultStack"></interceptor-ref> 
     <result name="success">/jsp/welcome.jsp</result> 
    </action> --> 

</package> 

的LoginAction:

@InterceptorRef(value = "defaultStack") 
@ParentPackage("struts-default") 

@Results({ @Result(name = "success", location = "/jsp/xyz.jsp"), 
     @Result(name = "error", location = "/jsp/error.jsp"), 
     @Result(name = "noAccess", location = "/jsp/abc.jsp"), 
     @Result(name = "somePage", location = "/jsp/somePage.jsp"), 
     @Result(name = "input", location = "/jsp/login.jsp"), }) 
public class LoginAction extends ActionSupport implements SessionAware, 
     ModelDriven<MySession> { 
private static final long serialVersionUID = -3369875299120377549L; 
private String userId; 
private String result = null; 
@Autowired 
CompService CompService; 

MySession MySession = new MySession(); 
@Autowired 
MyServices MyServices; 

private Map<String, Object> sessionAttributes = null; 
/*private User user = new User();*/ 

@Override 
public String execute() { 
    System.out.println("inside execute"); 
    System.out.println("userid************" + this.userid); 
    if (this.userid != null) { 

     HttpSession session = ServletActionContext.getRequest() 
     .getSession(); 
     useridProfile profile = MyServices.getuseridProfile(this.userid); 
     if (profile != null) { 
      //here i am getting a collection say my Coll 
      if (myColl.isEmpty()) { 
       result = "noAcess"; 
      } 
      else{ 
       sessionAttributes.put("userId", userId); 
       result = "success"; 
      } 

     } 

     return result; 
    } else if (sessionAttributes.get("userid") == null) { 

     System.out.println("Not logged in"); 
     System.out.println("userid************" + this.userid); 
     result = "somePage"; 
    } 
    return result; 
} 

@Override 
public void setSession(Map<String, Object> sessionAttributes) { 
    this.sessionAttributes = sessionAttributes; 
} 

public String getuserId() { 
    return userid; 
} 

public void setuserId(String userid) { 
    this.userid = userid; 
} 

@Override 
public MySession getModel() { 
    // TODO Auto-generated method stub 
    return MySession; 
} 

} 

AuthenticationInterceptor

public class AuthenticationInterceptor implements Interceptor{ 

    private static final long serialVersionUID = -5011962009065225959L; 

    String result=null; 
@Override 
public void destroy() { 
    //release resources here 
} 

@Override 
public void init() { 
    // create resources here 
} 

@Override 
public String intercept(ActionInvocation actionInvocation) 
     throws Exception { 

    ActionContext sessionAttributes = actionInvocation.getInvocationContext(); 
    System.out.println("inside auth interceptor"); 
    Object sess = sessionAttributes.get("userid"); 

    System.out.println("inside auth interceptor"+sess); 
    // User user = (User) sessionAttributes.get("USER"); 

    if(sess == null){ 

     if(sessionAttributes.get("userId") != null){ 
      result = actionInvocation.invoke(); 


    } 
     return result; 
    } 
     else{ 

     return actionInvocation.invoke(); 

    } 


} 
} 

登錄JSP

<%@ page language="java" contentType="text/html; charset=US-ASCII" 
    pageEncoding="US-ASCII"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<%-- Using Struts2 Tags in JSP --%> 
<%@ taglib uri="/struts-tags" prefix="s"%> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> 
<title>Login Page</title> 
</head> 
<body> 
<h3>Welcome User, please login below</h3> 
<s:form action="login"> 
    <s:textfield name="userId" label="userId"></s:textfield> 
    <s:submit value="Login"></s:submit> 
</s:form> 
</body> 
</html> 
+2

如果你的名字'ActionContext'爲'sessionAttributes'是不會改變它輸入到會話。 –

回答

1

你不使用你的動作定義的authStack:

<action name="welcome" class="com.mycompany.abc.webapp.action.WelcomeAction"> 
<interceptor-ref name="authStack"></interceptor-ref> 
    <result name="success">/jsp/welcome.jsp</result> 
</action> 

如果你使用註解,那麼WelcomeAction應該有@InterceptorRef(值=「authStack」)。

還要注意的是(你不使用會話)這行代碼是不需要的:

HttpSession session = ServletActionContext.getRequest().getSession(); 

最後(也是最重要的),你的攔截器是錯誤的。下面的代碼行返回ActionContext中,不是會話:

ActionContext sessionAttributes = actionInvocation.getInvocationContext(); 

如果要返回會話,請嘗試:

Map<String, Object> session = ActionContext.getContext().getSession(); 
0

你的攔截器的代碼完全是胡說八道。

public String intercept(ActionInvocation actionInvocation) throws Exception { 
    ActionContext sessionAttributes = actionInvocation.getInvocationContext(); 

    Object sess = sessionAttributes.get("userid"); 
    if (sess == null) { 
     if (sessionAttributes.get("userId") != null) { 
      result = actionInvocation.invoke(); 
     } 
     return result; 
    } 

    return actionInvocation.invoke(); 
} 
  1. 獲取 「用戶ID」
  2. 如果它是空...
  3. ...檢查看看,如果它不是空的,...
  4. ...如果它不是」 t,調用並返回操作的結果。
  5. 如果不是... 1 ....調用並返回操作的結果。

而且假設你實際上看會話,which you're not

你的意思做,大致從內存:

public String intercept(ActionInvocation actionInvocation) throws Exception { 
    Map<String, Object> session = actionInvocation.getInvocationContext().getSession(); 
    return session.containsKey(SESSION_USER_KEY) ? actionInvocation.invoke() 
               : GLOBAL_RESULT_LOGIN; 
}