以前我们写的拦截器继承AbstractInterceptor类,可能会拦截整个Action中的所有方法而无法控制。而在实际开发中,很多时候我们只希望那个拦截器拦截某一个或者某几个请求,这样就导致了有些方法本来不用拦截,而拦截器将其拦截造成麻烦。所以这里编写自定义拦截器时就可以继承MethodFilterInterceptor类,这样就可以选择某些方法进行拦截,而不会拦截一个Action里面所有的方法。使编程更加灵活。
在struts2中提供了一个com.opensymphony.xwork2.interceptor.MethodFilterInterceptor抽象类,该类继承ActionInvocation类,并重写了intercept()方法,同时还提供了doIntercept()抽象方法。
MethodFilterInterceptor中提供了两个方法:
public void setExcludeMethods(String excludeMethods):设置不需要过滤的方法,所有在excludeMethods字符串列出的方法都不会被拦截。
public void setIncludeMethods(String includeMethods) :设置需要过滤的方法,所有在includeMethods字符串列出的方法都不会被拦截。
注意:如果一个方法的名称同时出现在以上两种方法中,则此方法会被拦截。
示例代码:
示例说明:访问web首页时显示一个超链接,点击可进入用户中心,但是在进入用户中心之前会被拦截器拦截判断用户是否登录,如果没有登录,拦截到登录界面,如果已经登录,进入用户中心。
首页index.jsp:
<a href="LoginAction!see.action">点击进入用户中心</a>
拦截器:
SeeInterceptor.java:
package com.web.interceptor;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//检测用户查看资源时是否登录的拦截器
//继承MethodFilterInterceptor可以选择某些方法进行拦截
@SuppressWarnings("serial")
public class SeeInterceptor extends MethodFilterInterceptor {
protected String doIntercept(ActionInvocation arg0) throws Exception {
System.out.println("进来拦截器没");
//获取session
Map<String, Object> session=arg0.getInvocationContext().getSession();
//获取session里面存的username
String username=(String) session.get("username");
//如果session里面存的有用户名,证明用户登录了
if(username!=null&&!username.equals("")){
return arg0.invoke();
}else{
return Action.LOGIN;
}
}
}
action:LoginAction.java:
package com.web.action;
@SuppressWarnings("serial")
public class LoginAction extends BaseAction{
private String username;
private String password;
public String see(){
return SUCCESS;
}
//处理登录的方法
public String login(){
if(username.equals("admin")&&password.equals("123456")){
session.put("username", username);
return "index";
}else{
return LOGIN;
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
用户中心界面:success.jsp:
<h2>登陆成功,这里是用户中心</h2>
登录界面:login.jsp:
<h2>拦截器测试</h2>
<s:form action="LoginAction!login.action" method="post">
<s:textfield name="username" label="姓名"></s:textfield>
<s:password name="password" label="密码"></s:password>
<s:submit value="登录"></s:submit>
</s:form>
struts2配置文件:struts.xml:
<struts>
<constant name="struts.devMode" value="true"></constant>
<!-- 配置包元素 -->
<package name="default" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="SeeInterceptor" class="com.web.interceptor.SeeInterceptor"></interceptor>
</interceptors>
<action name="LoginAction" class="com.web.action.LoginAction">
<interceptor-ref name="SeeInterceptor">
<!-- 设置不用被过滤的方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="login">/login.jsp</result>
<result name="index">/index.jsp</result>
</action>
</package>
</struts>
web.xml:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>