from:http://www.cnblogs.com/huzx/archive/2011/06/09/2076328.html
今天在做用戶的登陸認證的時候出現的問題。
在傳參數的時候,發現參數丟失,導致頁面出錯 。
<interceptors>
<interceptor name="checkLogin" class="com.topsoft.interceptor.LoginInterceptor" />
</interceptors>
<action name="login" class="com.action.LoginAction">
<result name="success">/admin/list.jsp</result>
<interceptor-ref name="checkLogin" />
</action>
在網上找了一下,說struts-default中,默認的攔截器引用是defaultstack,這個攔截器包傳說是經過精心設計的。。所以會把所有的參數注入!。。。
因此要更改默認攔截器,需要加上這個defaultstack.
修改如下
<interceptors>
<interceptor name="checkLogin" class="com.topsoft.interceptor.LoginInterceptor" />
<interceptor-stack name="checkLoginStack">
<interceptor-ref name="checkLogin"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
這裏的action的攔截器就引用這個checkLoginStack
<action name="login" class="com.action.LoginAction">
<result name="success">/admin/list.jsp</result>
<interceptor-ref name="checkLoginStack" />
</action>
下面貼出我自己的struts.xml的配置信息
<package name="administrator" extends="struts-default" namespace="/admin" >
<!-- Interceptors -->
<interceptors>
<interceptor name="checkLogin" class="com.interceptor.LoginInterceptor" />
<interceptor-stack name="checkLoginStack">
<interceptor-ref name="checkLogin"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 注意下面的綠色字的部分,我把登陸的action也放在了這個包下面,所以如果指定這個默認的攔截器的話,那登陸那裏就登陸不了了,因爲這個攔截器會對這個包裏的所有Action進行攔截。當登陸的時候,也會進行攔截,對session裏的User對象進行是否爲空的驗證,而這個時候session裏的User對象肯定是空的,那麼就被攔截下來了,不會跳轉到LoginAction進行登陸操作。 所以說這裏最好把登陸的Action放在別的包裏,這樣下面這一句就可以對該包的所有Action進行攔截,進行登陸認證,判斷用戶是否登陸,如果沒有登陸,那好,對不起,請你出去,登陸再來操作。所有在我的源配置文件裏,下面這一句是沒有的,不要弄錯了。-->
<!--這一句會對該包裏的所有Action進行攔截,而不需要在Action裏具體指定該攔截器-->
<default-interceptor-ref name="checkLoginStack"></default-interceptor-ref>
<global-results>
<result name="login">/admin/login.jsp</result>
</global-results>
<action name="adminList" class="com.action.ArticleList">
<result name="success">/admin/list.jsp</result>
<interceptor-ref name="checkLoginStack"></interceptor-ref>
</action>
<!-- Login -->
<action name="loginn" class="com.action.LoginAction">
<result name="success">/admin/index.html</result>
<result name="login">/admin/login.jsp</result>
</action>
<!-- get All User list -->
<action name="userList" class="com.action.UserListAction">
<result name="success">/admin/Users.jsp</result>
<interceptor-ref name="checkLoginStack"></interceptor-ref>
</action>
</package>
這是登陸驗證的攔截器
public class LoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation ai) throws Exception {
// TODO Auto-generated method stub
System.out.println("------------------Check Login----------------------------");
Map<String,Object> session=(Map<String,Object>)ai.getInvocationContext().getSession();
Admin user=(Admin)session.get("user");
if(user==null)
{ return Action.LOGIN; } else { return ai.invoke(); }
}
}