# 使用`@InterceptorRef`的 Struts2 自定义拦截器示例

> 原文： [https://howtodoinjava.com/struts2/struts-2-custom-interceptor-with-interceptorref-example/](https://howtodoinjava.com/struts2/struts-2-custom-interceptor-with-interceptorref-example/)

在以前的帖子中，我们了解了 [helloworld 应用](//howtodoinjava.com/struts-2/struts-2-hello-world-with-annotations/ "Struts2 hello world with annotations")和[设置 Struts2 应用](//howtodoinjava.com/struts-2/how-to-correctly-set-result-path-in-struts-2/ "How to correctly set result path in Struts2")的结果路径。 现在，在这篇文章中，我将举一个使用注释的自定义或用户定义的拦截器配置示例。

拦截器是一个类，其每次访问已配置的服务器资源时都会调用其预定义方法。 这可以在资源访问之前或之后访问。 请注意，此处的资源访问也意味着 HTTP 请求处理。

```java
Steps summary:
1) Create custom interceptor class which implements com.opensymphony.xwork2.interceptor.Interceptor
2) Implement overridden methods
3) Give definition in struts.xml file
4) Apply on any Action class
```

**重要**：请注意，Struts2 随附了许多现成的拦截器实现，因此请确保您确实需要创建自己的拦截器，或者有什么适合您的。

## 1）& 2）创建自定义拦截器类并实现重写的方法

以下是自定义拦截器的示例代码，以及所有替代方法的实现。 请随时以适当的方法添加应用逻辑。

```java
package com.howtodoinjava.struts2.example.web;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class DemoCustomInterceptor implements Interceptor
{
	private static final long serialVersionUID = 1L;

	@Override
	public void destroy() {
		System.out.println("DemoCustomInterceptor destroy() is called...");
	}

	@Override
	public void init() {
		System.out.println("DemoCustomInterceptor init() is called...");
	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception 
	{
		System.out.println("DemoCustomInterceptor intercept() is called...");
		System.out.println(invocation.getAction().getClass().getName());
		return invocation.invoke();
	}
}

```

## 3）在`struts.xml`文件中给出定义

这是非常重要的一步，因为在这里您可以在 struts 上下文和运行时中注册拦截器类。

```java
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<package name="default" namespace="/" extends="struts-default">
		<interceptors>	
			<interceptor name="demoCustomInterceptor" class="com.howtodoinjava.struts2.example.web.DemoCustomInterceptor" />
			<interceptor-stack name="customStack">
	     		<interceptor-ref name="demoCustomInterceptor"/>
				<interceptor-ref name="defaultStack" />
        	</interceptor-stack>
	    </interceptors>	    
	</package>

	<constant name="struts.convention.result.path" value="/WEB-INF/jsp/" />
	<constant name="struts.devMode" value="true" />
	<constant name="struts.action.extension" value="action," />
	<constant name="struts.custom.i18n.resources" value="test" />
	<constant name="struts.convention.default.parent.package" value="default"/>

</struts>

```

## 4）应用任何动作类

我在一个这样的`TestAction`类中应用了上面的拦截器。

```java
package com.howtodoinjava.struts2.example.web;

import java.util.Date;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ActionSupport;

@InterceptorRef(value="customStack")
@Results({
	   @Result(name="success", location="success.jsp"),
	   @Result(name="input", location="index.jsp")
})
public class TestAction extends ActionSupport 
{
	private static final long serialVersionUID = 1L;

	private String name;
    private Date nowDate;

    @Override
    public void validate(){
        if (name==null || name.length()==0)
            addActionError(getText("error.enter.message"));
    }
    @Actions({
        @Action("/"),
        @Action("/test")
    })
    @Override
    public String execute() throws Exception {
        nowDate = new Date();
        return ActionSupport.SUCCESS;
    }
    public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getNowDate() {
        return nowDate;
    }
}

```

请注意，我已经使用`@InterceptorRef(value="customStack")`定义应用了拦截器。 它可以帮助您一次性应用多个拦截器。 如果仅只需要特定的拦截器，请使用其名称，如下所示：`@InterceptorRef(value="demoCustomInterceptor")`

## 测试应用

当我运行上面的应用时。 我观察到服务器在控制台中的日志如下：

```java
INFO: Loading global messages from [test]

DemoCustomInterceptor init() is called...

//some logs
INFO: Server startup in 1146 ms

DemoCustomInterceptor intercept() is called...
com.howtodoinjava.struts2.example.web.TestAction

```

请点击下面的链接下载该项目的源代码。

**祝您学习愉快！**