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