前面实现了登录action,在以后发帖的过程中,必须要审核用户是否登录,如果登录了才能正常发帖,不然就返回注册界面。
这不,用上了拦截器。需要实现拦截器接口Interceptor 。
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
init和destroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执行。
intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。
自定义拦截器LoginInterceptor:
import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoginInterceptor implements Interceptor {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
Map map= arg0.getInvocationContext().getSession();
if (map.get("USER_NAME")!=null) {
return arg0.invoke();
}else{
return "noLogin";
}
}
}
然后在struts.xml中注册:
<interceptors>
<!--判断是否登录-->
<interceptor name="login" class="pengbbs.controller.LoginInterceptor" />
<interceptor-stack name="myStack">
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors><default-interceptor-ref name="myStack"></default-interceptor-ref>
在这里定义拦截器栈,以供调用。其中还有别的拦截器,下文说明。还需要引用默认defaultStack。并把myStack定义为默认拦截器。
这样一个简单的拦截器就ok了。
同上文中实现登录登出操作,系统实现了postaction,即发帖操作。但发帖必须先登录,所以在这里要引入上面的登录拦截器。如下:
<action name="post" class="postAction">
<result name="success">/post_view.jsp</result>
<result name="invalid.token">/error.jsp</result>
<result name="notPost">/error.jsp</result>
<interceptor-ref name="myStack"></interceptor-ref>
<interceptor-ref name="token"></interceptor-ref>
<result name="noLogin" type="redirect">/login.jsp</result>
</action>
上面的postAction需要在spring的xml中注册。
<bean id="postAction" class="pengbbs.controller.PostAction"
abstract="false" lazy-init="default" autowire="default"
p:userService-ref="userService">
</bean>
这样就实现了发帖的登录拦截操作。如果没有登录,即转到登录页面。