好好利用Struts2拦截器

  继续学习SSH项目,当前完成了用户注册、登录、查看调查,新建调查几个简单的功能,为了程序的健壮性,比如当我们查看调查,新建调查的时候,就应该判断用户是否登陆过,如果没有登录的,则让其进行登录,然后再进行其他操作。

  这样的话,利用struts的拦截器来实现是非常方便的。因为struts2中,到达action之前是先进入拦截器中的。所以可以在拦截器中进行判断,下面上部分代码:

  

/**

 * 登录拦截器,实现对用户登录的拦截操作

 * @author Bubble

 */

@SuppressWarnings("serial")



public class LoginInterceptor implements Interceptor {



	@Override

	public void destroy() {



	}



	@Override

	public void init() {



	}



	@Override

	public String intercept(ActionInvocation arg0) throws Exception {

		@SuppressWarnings("rawtypes")

		BaseAction action = (BaseAction) arg0.getAction() ;

		//如果 action 为登录或者注册 action 的话,则放行

		if(action instanceof LoginAction ||

				action instanceof RegAction){

			return arg0.invoke() ;

		}

		//其他Action则校验 是否登录

		else{

			User user = (User) arg0.getInvocationContext().getSession().get("user") ;

			if(user == null){

				//user 为空,则去登录

				return "login" ;

			}else{

				//放行

				if(action instanceof UserAware){

					((UserAware) action).setUser(user);

				}

				return arg0.invoke() ;

			}

		}

	}



}

  然后记得修改 struts.xml文件

<!-- 自定义拦截器 -->

		<interceptors>

			<!-- 注册用户登录拦截器 -->

			<interceptor name="loginInterceptor" class="com.ysp.surveypark.struts2.LoginInterceptor" />

			<interceptor-stack name="myLoginStack">

				<interceptor-ref name="loginInterceptor"/>

				<interceptor-ref name="defaultStack"/>

			</interceptor-stack>

		</interceptors>

		

		<!-- 使用自定义拦截器栈 -->

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

		

		<!-- 配置全局 login页面 -->

		<global-results>

			<result name="login">/index.jsp</result>

		</global-results>

  同样,很多时候,我们需要获取登录用户的session,比如,查看调查,新建调查。每次都要从session中获取user对象,这样可以让其 action 实现 sessionAware 接口,然后获得 对应的session,但是如果这样的话,就会分别在其方法上获取。代码就重复了,所以可以同样利用 拦截器原理,代码同上:可以让需要获取 user session的action实现对应的UserAware,UserAware接口中有一个 setUser(User user)方法,在拦截器中判断传过来的 action 是否实现了 UserAware接口,如果实现了,则调用setUser(User user)方法设置 user.这样的话,就很简洁明了了

你可能感兴趣的:(struts2拦截器)