struts2中自定义拦截器

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>

猜你喜欢

转载自blog.csdn.net/dimples_qian/article/details/81175907