1、需求
当用户没有登录时,不允许其直接通过URL访问业务模块的Action,那么这个要求适用于除登录模块之外的所有业务模块,具有很强的通用性,采用拦截器实现
2、实现
1)创建拦截器
需要从Session中读取出登录信息,判断是否登录,若没有登录则不调用invoke,利用拦截方法的返回值,跳转回登录页面。
2)注册拦截器
要注册拦截器栈,包含登录检查拦截器以及默认的拦截器栈。
3)引用拦截器
直接引用我们注册好的拦截器栈即可。
struts.xml
当用户没有登录时,不允许其直接通过URL访问业务模块的Action,那么这个要求适用于除登录模块之外的所有业务模块,具有很强的通用性,采用拦截器实现
2、实现
1)创建拦截器
需要从Session中读取出登录信息,判断是否登录,若没有登录则不调用invoke,利用拦截方法的返回值,跳转回登录页面。
2)注册拦截器
要注册拦截器栈,包含登录检查拦截器以及默认的拦截器栈。
3)引用拦截器
直接引用我们注册好的拦截器栈即可。
interceptor:
public class LoginInterceptor implements Interceptor{
public void destroy(){
}
public void init() {
}
public String intercept(ActionInvocation arg0) throws Exception {
//从session中读取登陆信息
Map<String,Object> session = arg0.getInvocationContext().getSession();
Admin admin = (Admin)session.get("admin");
//判断登陆信息是否为空,没有登录直接返回结果,登陆的可以调用Action
if(admin==null){
return "login";
}else{
arg0.invoke();
}
return null;
}
}
struts.xml
<package name="netctoss" extends="json-default">
<!-- 注册拦截器 -->
<interceptors>
<!-- 登陆检查拦截器 -->
<interceptor name="loginInter" class="netctoss.interceptor.LoginInterceptor"></interceptor>
<!-- 登陆检查拦截器栈 -->
<interceptor-stack name="loginStack">
<interceptor-ref name="loginInter"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 覆盖拦截器的引用 ,当前包下所有的Action都默认使用该拦截器-->
<default-interceptor-ref name="loginStack"/>
<!-- 定义全局的result,当前包下所有的Action都可以使用该Result,相当于每个Action下都 追加了该Result配置-->
<global-results>
<result name="login" type="redirectAction">
<param name="namespace">/login</param>
<param name="actionName">toLogin</param>
</result>
<result name="error">
/WEB-INF/main/error.jsp
</result>
</global-results>
</package>
<!--引用拦截器-->
<package name="cost" namespace="/cost" extends="netctoss">...</package>