拦截器和过滤器的区别
①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
实现拦截器有两种方法
1,Interceptor接口声明了三个方法:
public Classname implements Interceptor {
void destroy();//销毁的方法
void init();//初始化的方法
String intercept(ActionInvocation invocation) {
}//具体实现拦截
}
Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
2,AbstractInterceptor
public classname extends AbstractInterceptor {
public abstract String intercept(ActionInvocation invocation){
invocation.invoke();放行
}
}
二:下面是一个简单的控制登陆访问的拦截器
package com.dark.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DemoAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String username;
private Map<String, Object> request;
/**
* 拦截页面一
*/
public String demoOne() {
request = (Map<String, Object>) ActionContext.getContext().get("request");
Map<String, Object> session = ActionContext.getContext().getSession();
System.out.println("用户名" + username);
session.put("username", username);
request.put("info", "登陆成功");
return "success";
}
@Override
public String execute() throws Exception {
return "success";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
package com.dark.interceptor;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class LoginInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 取得请求相关的ActionContext实例
// 获取Map类型的session
Map session = ActionContext.getContext().getSession();
String user = (String) session.get("username");
System.out.println(user);
// 如果没有登陆,返回重新登陆
if (user != null) {
System.out.println("拦截器执行[1]");
String value = invocation.invoke();
System.out.println(value);
System.out.println("拦截器执行[2]");
return value;
}
System.out.println("拦截器执行------用户未登录");
return Action.LOGIN;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<package name="mypacket" extends="struts-default">
<!-- 声明拦截器列表 -->
<interceptors>
<!-- 定义拦截器 -->
<interceptor name="loginedCheck" class="com.dark.interceptor.LoginInterceptor">
<!-- 其中includeMethods ,excludeMethods是固定写法: includeMethods 包含拦截那些方法,多个方法需要用”,”隔开;
excludeMehtods是排除拦截的那些方法; -->
<!-- <param name="includeMethods">execute</param> -->
<!-- <param name="excludeMethods">execute</param> -->
</interceptor>
<interceptor name="timer"
class="com.opensymphony.xwork2.interceptor.TimerInterceptor" />
<!-- 定义拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="params" />
<interceptor-ref name="loginedCheck" />
<!-- 一旦配置了拦截器,那么默认拦截器就失效,所以在拦截器栈中,一般会将默然拦截器放在最后 -->
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<!-- 定义全局result -->
<global-results>
<result name="login">/WEB-INF/page/login.jsp</result>
</global-results>
<action name="login" class="com.dark.action.DemoAction" method="demoOne">
<interceptor-ref name="params" />
<interceptor-ref name="timer"></interceptor-ref>
<result name="success">/WEB-INF/page/demoOne.jsp</result>
</action>
<action name="demoOne" class="com.dark.action.DemoAction">
<!-- 使用拦截器 -->
<interceptor-ref name="mystack"></interceptor-ref>
<result name="success">/WEB-INF/page/demoOne.jsp</result>
</action>
</package>
</struts>