Struts2拦截器的实现

拦截器和过滤器的区别

①拦截器是基于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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值