首页 > 代码库 > 好好利用Struts2拦截器

好好利用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拦截器