开发自定义拦截器

开发自定义拦截器:
    拦截器一般用于完成一些具有通用性质的、而且横跨多个Action的相同的逻辑。
    (1)开发拦截器实现类,拦截器实现需要实现Interceptor接口。
       实现该接口就需要实现它的3个方法。
    (2)使用<interceptor.../>元素定义拦截器。
       不要用<interceptor-ref.../>使用拦截器。

       当然,可以把我们开发的拦截器添加到默认的拦截器栈中。


权限控制拦截器:(没有登陆的用户不能下载文件)

拦截器类:

  

package pers.zkr.interceptor;

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

public class AuthInterceptor implements Interceptor {

	private String allowAction;

	public String getAllowAction() {
		return allowAction;
	}

	public void setAllowAction(String allowAction) {
		this.allowAction = allowAction;
	}

	// 拦截器销毁之前的回调方法
	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	// 对拦截器进行初始化的方法。
	@Override
	public void init() {
		// TODO Auto-generated method stub

	}

	// 每次进入Action之前,都会回调该方法
	// 该方法的ActionInvocation参数代表当前Action的执行环境。
	// 通过该参数,就可以获取调用Action的实例、被拦截的方法等。
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
		ActionContext actCtx = invocation.getInvocationContext();

		Integer userId = (Integer) actCtx.getSession().get("userId");

		// 获取当前调用Action的名字
		String currentActionName = actCtx.getName();
		for (String name : allowAction.split(",")) {

			//如果录前被调用Action属于需要放行的Action
			if (name.equals(currentActionName)) {
				//让Action继续处理即可。
				return invocation.invoke();
			}
		}

		// 表明已经登录
		if (userId == null || userId < 0) {

			return Action.LOGIN;

		}
		// 否则表明已经的登录----放行,让Action继续处理即可。
		return invocation.invoke();
	}

}
下载文件的类:(有了拦截器就不用在下载文件的execute判断session)

 

package pers.zkr.action;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;


//此处是一个通用的文件 下载Action,如下内容是可变的
//1.下载的目标资源(名字)     2.下载的文件类型。  3.下载的文件名(另起的名字)
public class DownAction extends ActionSupport {

	private String res;   //下载的资源,服务器里面文件的名字
	private String resType;   //下载的文件类型
	private String resName;   //下载的文件名,下载文件时,给文件起的名字
	public String getRes() {
		return res;
	}
	public void setRes(String res) throws IOException {
		this.res = new String(res.getBytes("iso-8859-1"),"utf-8");
				
	}
	public String getResType() {
		return resType;
	}
	public void setResType(String resType) {
		this.resType = resType;
	}
	public String getResName() {
		return resName;
	}
	public void setResName(String resName) {
		this.resName = resName;
	}
	
	
	//该方法代表了文件下载的入口,它就是我们要让客户下载的文件的输入流
	public InputStream getTarget() throws IOException{
		
		
		//返回res资源所对应的输入流。
		return new FileInputStream(ServletActionContext.
				getServletContext().getRealPath("/")+res);
		
	}
	
	//对下载的权限进行控制
	public String execute(){
		
		
		return SUCCESS;
	}
	
	
}

struts.xml

<?xml version="1.0" encoding="GBK" ?>
<!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.devMode" value="true" />

	<package name="default" extends="struts-default">

		<interceptors>
			<interceptor name="authInterceptor" class="pers.zkr.interceptor.AuthInterceptor" >
			
				<param name="allowAction">loginPro</param><!--以后那一个Action不想被拦截只要加副逗号分开就行了  -->
			</interceptor>	
			<!--在系统默认的拦截器栈中,添加了权限控制 -->
			<interceptor-stack name="authStack">
			
				<interceptor-ref name="defaultStack" />
				<!-- 插入一个自定义的拦截器 -->
				<interceptor-ref name="authInterceptor" />

			</interceptor-stack>
		</interceptors>
			
			<!--如果Action中没有指定拦截器,默认就使用该拦截器  -->
		<default-interceptor-ref name="authStack"/>
		
		<global-results>
			<result name="login">/WEB-INF/content/login.jsp</result>
		</global-results>
			
		<action name="down" class="pers.zkr.action.DownAction">

			<!-- <interceptor-ref name="defaultStack" /> 插入一个自定义的拦截器 <interceptor-ref 
				name="authInterceptor" /> -->

			
			<result type="stream">
				<!--该参数指定二进制流的类型 -->
				<param name="contentType">${resType}</param>
				<!--指定返回InputStream的方法 -->
				<param name="inputName">target</param>
				<!-- 指定文件 下载后,在客户端显示的文件 的名字 -->
				<param name="contentDisposition">filename=${resName}</param>
				<!-- 指定文件下载的缓冲的大小 -->
				<param name="bufferSize">4096</param>
			</result>

		</action>

		<action name="loginPro" class="pers.zkr.action.LoginProAction">
		
			<!-- 配置一个默认的拦截器,以防止我们自定义的默认的拦截器,对此action对行拦截 -->
			<!-- <interceptor-ref name="defaultStack"/> -->
			<result name="error">/WEB-INF/content/error.jsp</result>
			<result name="success">/WEB-INF/content/downPage.jsp</result>
		</action>

		<action name="*">
			<!-- 配置一个默认的拦截器,以防止我们自定义的默认的拦截器,对此action对行拦截 -->
			<interceptor-ref name="defaultStack"/>
			<result>/WEB-INF/content/{1}.jsp</result>
		</action>



	</package>

</struts>


  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值