案例:登陆拦截的拦截器
第一步:写拦截器
/**
* 检查登录的拦截器
*
*/
public class CheckLoginInterceptor extends MethodFilterInterceptor {
protected String doIntercept(ActionInvocation arg0) throws Exception {
//1.获取session 对象
HttpSession session=ServletActionContext.getRequest().getSession();
//2.在session域中找user对象
User user=(User)session.getAttribute("user");
//3.有 放行
if(user==null){
return "login";
}
//4.前往登录页面
return arg0.invoke();
}
}
第二步:重置默认拦截器栈
<!-- 自定义拦截器的配置 -->
<package name="mydefault" extends="struts-default" abstract="true">
<interceptors>
<interceptor name="CheckLoginInterceptor" class="com.itheima.web.interceptor.CheckLoginInterceptor"></interceptor>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="CheckLoginInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 重置默认拦截器栈 -->
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
<!-- 全局结果视图 -->
<global-results>
<result name="login">/login/login.jsp</result>
</global-results>
</package>
说一下全局结果视图的作用:避免代码冗余,如果不写全局视图,那么每个动作类都要多写一个
<result name="login">/login/login.jsp</result>。
第三步:那个包里面的动作需要拦截,就继承MyDefault包
这里需要说明一点:xxx包继承myDefault包。这里的执行顺序是这样的,先找动作类自己的,如果类中没有,在去全局视图中查找。
<package name="user" extends="mydefault" namespace="/user">
<!-- 添加用户 -->
<action name="add" class="com.itheima.web.action.UserAction" method="add">
<!-- 配置上传文件的扩展名限制 -->
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedExtensions">.doc,.docx</param>
</interceptor-ref>
<result>/user/list.jsp</result>
<result name="input">/user/add.jsp</result>
</action>
<package>