登陆示例

发表时间:2017-05-16 15:44:44 浏览量( 15 ) 留言数( 0 )

学习目标:

1、掌握灵活的使用拦截器

2、掌握本节课的登陆示例中拦截器的使用


学习过程:

前面提过struts2的设计非常好,功能模块化,可装配。下面我们就通过一个登录示例体会一下struts2的优良的设计。先简单说说我们的需求,我们已经完成了用户列表的基本的增删改查和登录操作。用户初始要求:

1、用户列表可以不登录访问。

2、其他删除、修改、添加都必须要登录后才能操作。

在这里我们当然可以在删除、修改、添加方法里面添加一个判断。如下面这样:

public String adduser() {
    if(session.get("user")==null){
    return "nologin";
    }
    userDao.add(user);
    return SUCCESS;
}

但是这样不好的地方就是把登录判断的功能和添加功能耦合在一起了。而且删除、修改等方法也要这样判断,也会造成代码的冗余。所以这不是一种良好的编程习惯。下面我们用更好的方法来实现这个功能。

一、使用拦截器实现登录的拦截

1、拦截器的实现。代码如下:

public class LoginInterceptor implements Interceptor {
    public String intercept(ActionInvocation ai) throws Exception {
        Map<String, Object> session=ai.getInvocationContext().getSession();
        if(session.get("user")==null){
            return "nologin";
        }
        return ai.invoke();
    }
    public void destroy() {
    }
    public void init() {
    }
}

2、在struts的配置文件users.xml中配置这个拦截器。代码如下:

<interceptor name="loginInterceptor" class="com.myinterceptor.LoginInterceptor"></interceptor>

3、现在我们可以在相关的删除、修改、添加方法的action配置中使用这个拦截器了。注意要显示的调用默认拦截器。这里就举删除用户作为例子,其他的修改、添加和添加方法也一样。

<action name="userdel" class="com.action.UserAction" method="deluser">
    <result name="success" type="redirectAction">userlist</result>
    <result name="nologin" type="redirect">/login.jsp</result>
    <interceptor-ref name="loginInterceptor"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
</action>

这样我们就可以把登录判断功能模块和其他功能模块分开了。


二、改进配置

每一个需要登录判断的action都要添加这三行代码,确实有点麻烦,我们可以优化一下。

<result name="nologin" type="redirect">/login.jsp</result>
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>

1、把登录判断拦截和默认拦截封装成为一个拦截器栈。

<interceptor-stack name="loginStack">
    <interceptor-ref name="login"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>

2、定义一个登录拦截判断的包。把上面的登录拦截器栈定义为默认拦截器,这样这个包和它的子包默认都会使用这个拦截器。还有一个全局的result定义。

<package name="login-default" extends="default">
   <default-interceptor-ref name="loginStack"></default-interceptor-ref>
   <global-results>
      <result name="nologin" type="redirect">/login.jsp</result>
   </global-results>
</package>

3、修改user.xml,把需要登录拦截的action抽出来定义在另外一个包中,这个包需要继承login-default包。

	<package name="user-login" namespace="/" extends="login-default">
		<action name="useradd" class="com.action.UserAction" method="adduser">
			<result name="success" type="redirectAction">userlist</result>
			<result name="invalid.token" type="redirect">/error.jsp</result>
			<interceptor-ref name="loginStack"></interceptor-ref>
			<!-- 在Action显示的使用拦截器 就会 覆盖默认的拦截器 所以要显示重新调用默认拦截器 -->
			<interceptor-ref name="logger"></interceptor-ref>
			<interceptor-ref name="timer"></interceptor-ref>
			<!-- 防止重复提交 -->
			<interceptor-ref name="token"></interceptor-ref>
		</action>

		<action name="userdel" class="com.action.UserAction" method="deluser">
			<result name="success" type="redirectAction">userlist</result>
		</action>

		<action name="userlist" class="com.action.UserAction" method="listuser">
			<result name="success">/userlist.jsp</result>
			<interceptor-ref name="oneAndTwo"></interceptor-ref>
		</action>

		<action name="toupdateuser" class="com.action.UserAction"
			method="toupdateuser">
			<result name="success">/userupdate.jsp</result>
		</action>

		<action name="updateuser" class="com.action.UserAction" method="updateuser">
			<result name="success" type="redirectAction">userlist</result>
		</action>
	</package>

以后凡是需要登录拦截的只需要把action放到继承了login-default的包里面就可以了。