欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
    }

再来一张拦截器的类视图:

struts2中自定义拦截器

接下来看我的代码:

自定义拦截器类:

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>

 

相关标签: struts2 拦截器