好好利用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.这样的话,就很简洁明了了
我们都是平凡的人,做着平凡的事,却希望它看上去不那么平凡