struts2中自定义拦截器
程序员文章站
2022-07-09 17:15:43
...
struts2里在struts-default.xml文件中有个叫defaultStack的拦截器栈这是默认的拦截器栈,我们之前的参数封装params和servlet-config拦截器都包含在这里面。当这里面的拦截器满足不了我们的需求时,我们可以自定义拦截器或拦截器栈,并将其设置为默认拦截器栈。
这里我们自定义一个登陆验证拦截器,除了登陆动作以外,其他动作全部拦截,那么此时我们需要一个叫MethodFilterInterceptor的拦截器,这是AbstractInterceptor的一个子类,功能更强大,可以选择拦截某些方法或不拦截某些方法,这个类的部分代码如下:
public abstract class MethodFilterInterceptor extends AbstractInterceptor {
protected transient Logger log = LoggerFactory.getLogger(getClass());
protected Set<String> excludeMethods = Collections.emptySet();
protected Set<String> includeMethods = Collections.emptySet();
public void setExcludeMethods(String excludeMethods) {
this.excludeMethods = TextParseUtil.commaDelimitedStringToSet(excludeMethods);
}
public Set<String> getExcludeMethodsSet() {
return excludeMethods;
}
再来一张拦截器的类视图:
接下来看我的代码:
自定义拦截器类:
package com.dimples.myIntercptor;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor extends MethodFilterInterceptor {
@Override
public String doIntercept(ActionInvocation invocation) throws Exception {
HttpSession session = ServletActionContext.getRequest().getSession();
if(session.getAttribute("username") == null) {
return "login";
}
String rtnValue = invocation.invoke();
return rtnValue;
}
}
这是struts.xml中的相关配置:
<package name="myDefaultPkg" extends="struts-default" abstract="true">
<interceptors>
<interceptor name="myInterceptor" class="com.dimples.myIntercptor.MyInterceptor"/> //先把自己写的拦截器定义上
<interceptor-stack name="myInterceptorStack"> //这是在自定义一个拦截器栈
<interceptor-ref name="myInterceptor"> //上面自定义的拦截器
<param name="excludeMethods">login</param> //我选择了排除某个方法,就不拦截登陆动作,这里的login对应的是方法名,不是action名
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref> //把默认的拦截器栈加上
</interceptor-stack>
</interceptors>
</package>
<package name="lastp" extends="myDefaultPkg" namespace="/last">
<!-- 声明默认拦截器的语句需放在第一行 -->
<default-interceptor-ref name="myInterceptorStack"/>
<action name="tijiaoInfo" class="com.dimples.action.Tijiao" method="tiJiao">
<result>/index.jsp</result>
<result name="login">/login.jsp</result>
<result name="input">/error.jsp</result>
</action>
<action name="login" class="com.dimples.action.Login" method="login">
<result>/success.jsp</result>
</action>
</package>