首页 > 代码库 > struts2 过滤器学习

struts2 过滤器学习

 

 作用:在访问action前,后 拦截,验证或进行相应处理。本人使用拦截器是要实现登录验证功能,在访问每个action前,验证是否存在用户session

1. 编写struts2 web.xml

<struts>    <constant name="struts.devMode" value=http://www.mamicode.com/"true" /><!-- 开发者模式-->    <constant name="struts.multipart.maxSize" value=http://www.mamicode.com/"50000000" /><!--设置最大上传限制,默认不超过2m(具体不清楚)-->    <package name="test" extends="struts-default" namespace="/">                     <!-- 定义一个拦截器 -->          <interceptors>              <interceptor name="authority"    class="com.zzbj.util.LoginInterceptor">              </interceptor>              <!-- 拦截器栈 -->              <interceptor-stack name="mydefault">                  <interceptor-ref name="defaultStack" />                 <interceptor-ref name="authority" />              </interceptor-stack>          </interceptors>                <default-interceptor-ref name="mydefault"/> <!--定义为默认拦截器,全局拦截,也可以针对action 定义拦截器-->              <!-- 定义全局Result -->          <global-results>              <!-- 当返回login视图名时,转入/login.jsp页面 -->              <result name="login">/index.jsp</result>            <!--后面三个是捕获action throws Exception-->
<result name="sql">/Error.jsp</result> <result name="invalidinput">/Error.jsp</result> <result name="naming">/Error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="sql" exception="java.sql.SQLException"></exception-mapping> <exception-mapping result="invalidinput" exception="cn.codeplus.exception.InvalidInputException"></exception-mapping> <exception-mapping result="naming" exception="javax.naming.NamingException"></exception-mapping> </global-exception-mappings> <action name="user_*" class="com.zzbj.action.UserAction" method="{1}"> <result>/UserManage.jsp</result> </action> </package></struts>


2. 自定义拦截器com.zzbj.util.LoginInterceptor

 1 public class LoginInterceptor extends AbstractInterceptor {    2     @Override   3     public String intercept(ActionInvocation invocation) throws Exception {   4         System.out.println("映射"); 5         // 取得请求相关的ActionContext实例   6         ActionContext ctx = invocation.getInvocationContext();   7         Map session = ctx.getSession();   8         String userRule = (String) session.get("RULE");   9         // 如果没有登陆,或者权限rule首位不为1(没有该类权限),都返回重新登陆  10         if (userRule != null && userRule.charAt(0)==1) {  11             System.out.println("已登录");  12             return invocation.invoke();  13         }  14         ctx.put("return", "你还没有登录");  15         return Action.LOGIN;  16     }    17 } 


最后bug 出现在我是使用的struts2,servlet 共存,所以 struts2 在web.xml中url-pattern 过滤的不是所有而是*.aciton   *.jsp.悲剧的发现对直接登录jsp页面毫无作用,决定使用servlet 的过滤器