java struct2拦截器_java struts2入门学习---拦截器学习

一、拦截器,拦截器栈

1、拦截器的作用

拦截器本质上和servlet的过滤器是一样的。在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦截器。

2、拦截器执行顺序

在struts.xml文件中,中先引用的先执行,后引用的后执行。如果某个拦截器出错或不允许通过,那么下一个拦截器是不允许执行的。

需要拦截哪个Action,就在哪个Action对应的标签中配置即可。

在部署web应用时,拦截器的空参构造方法和init()方法各执行一次,每次请求时intercept()方法都会执行一次。

3、自定义拦截器

1) 声明一个拦截器

注意:这里interceptors与action标签同级。其中class对应拦截器的全路径。name对应拦截器的名称,这个可以自己随便定义,建议与类名相同,此名称要唯一。

2)引用一个拦截器:

注意:如何引用一个拦截器?即在Action中标签下配置即可。这里name名称与自定义的名称要一致。

4、自定义拦截器栈

1)声明一个拦截器栈

interceptor-stack标签中进行配置需要引用的拦截器,如下:

2)引用一个拦截器栈:

二、需求分析

e452f05bbdb998823eafcb5517b3ea4e.png

如图所示,访问upload.jsp进行上传文件--》LoginInterceptor拦截器进行拦截---》

1、未登录,那么跳转页面到登录页面---》进行登录页面--》登录成功---》可以点击返回到上传文件页面;

2、已登录,登录直接开始上传文件。

三、代码分析:

upload.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Insert title here

--%>

View Code

upload_success.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Insert title here

--%>

View Code

login.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

login

View Code

login_success.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

login success

返回上传页面

View Code

sturts.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

View Code

upload-sturts.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

/login_success.jsp

/home/amosli/develop/struts2_learn/

/WEB-INF/upload_success.jsp

upload.jsp

login.jsp

5242880

.txt,.xml

text/plain,text/xml

View Code

LoginAction.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packageinterceptor;importjava.util.Map;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;/*** @ClassName: LoginAction

* @Description: 用户登录

*@author: amosli

* @email:amosli@infomorrow.com

* @date Jan 17, 2014 12:11:35 AM*/

public class LoginAction extendsActionSupport {private static final long serialVersionUID = 3514444221760688282L;privateString username;public voidsetUsername(String username) {this.username =username;

}publicString loginMethod() {//取得HTPPSession

Map session =ActionContext.getContext().getSession();

session.put("username", username);returnSUCCESS;

}

}

View Code

LoginInterceptor.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packageinterceptor;importjava.util.Map;importaction.UploadAction;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionInvocation;importcom.opensymphony.xwork2.interceptor.Interceptor;/*** @ClassName: LoginInterceptor

* @Description: 登录拦截器

*@author: amosli

* @email:amosli@infomorrow.com

* @date Jan 17, 2014 11:42:54 PM*/

public class LoginInterceptor implementsInterceptor {private static final long serialVersionUID = 8314579656513662711L;publicLoginInterceptor() {

System.out.println("LoginInterceptor():" + this.hashCode());

}public voiddestroy() {

System.out.println("destroy()");

}public voidinit() {

System.out.println("init()");

}public String intercept(ActionInvocation invocation) throwsException {

System.out.println("LoginInterceptor");// //获取此拦截器将要拦截的action//Object action = invocation.getAction();//System.out.println("action:"+action);//action:action.UploadAction@6522cf92// //获取action的返回值//String resultValue = invocation.invoke();//System.out.println("resultValue:"+resultValue);//resultValue:success//如果拦截器将要拦截的action为UploadAction,那么判断用户是否已经登录

if (invocation.getAction() instanceofUploadAction) {

Map session =ActionContext.getContext().getSession();if (session.get("username") != null) {//判断用户是否已经登录//如果返回值为"success"那么将会匹配到配置文件中为result属性为"success"的内容。//如果返回值为invocation.invoke(),那么将会执行uploadaction方法

returninvocation.invoke();

}else{return "toLoginJsp";

}

}return null;

}

}

View Code

UploadAction.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packageaction;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.OutputStream;importcom.opensymphony.xwork2.ActionSupport;/*** @ClassName: UploadAction

* @Description: 文件上传

*@author: amosli

* @email:amosli@infomorrow.com

* @date Jan 14, 2014 1:50:28 AM*/

public class UploadAction extendsActionSupport {private static final long serialVersionUID = -8920466592471253212L;private String username;//用户名

private String[] uploadContentType;//上传文件的类型,(Fileupload拦截器传入的参数)

private File[] upload;//上传的文件,(Fileupload拦截器传入的参数)

private String[] uploadFileName;//上传文件的真实文件名,(Fileupload拦截器传入的参数)

privateString uploadPath;public voidsetUploadPath(String uploadPath) {this.uploadPath =uploadPath;

}public voidsetUsername(String username) {this.username =username;

}publicString[] getUploadContentType() {returnuploadContentType;

}public voidsetUploadContentType(String[] uploadContentType) {this.uploadContentType =uploadContentType;

}publicFile[] getUpload() {returnupload;

}public voidsetUpload(File[] upload) {this.upload =upload;

}publicString[] getUploadFileName() {returnuploadFileName;

}public voidsetUploadFileName(String[] uploadFileName) {this.uploadFileName =uploadFileName;

}publicString getUsername() {returnusername;

}public String uploadMethod() throwsException {//ServletContext context = ServletActionContext.getServletContext();//String real_path = context.getRealPath("/WEB-INF/upload/");

for (int i = 0; i < upload.length; i++) {

InputStream inputStream= newFileInputStream(upload[i]);

OutputStream outputStream= new FileOutputStream(uploadPath + "/" +uploadFileName[i]);byte[] b = new byte[1024];int len = 0;while ((len = inputStream.read(b)) > 0) {

outputStream.write(b,0, len);

}//关闭流

inputStream.close();

outputStream.close();//删除tmp文件,最好是用tyrcatch finally进行删除//upload[i].delete();

}returnSUCCESS;

}

}

View Code

其中文件上传的代码主要引用上一篇文章中的,所以这里主要讲LoginInterceptor.java拦截器的代码分析:

实现Interceptor接口,重写其方法,这里主要注意intercept()方法。这里通过ActionInvocation类型的参数获取session值判断用户是否已经登录。

1)如果没有登录返回值为"toLoginJsp",这里对应upload-interceptor.xml中的result name,将其转发到login.jsp页面;

2)如果已经登录,那么执行上传,但这里需要注意的是, 如果返回值为"success"那么将会匹配到配置文件中为result属性为"success"的内容,如果返回值为invocation.invoke(),那么将会执行UploadAction方法,所以这里切记要return invocation.invoke();否则文件上传失败。

其中upload-sturts.xml的配置也是细节问题,主要可以参考文章开头的内容。

四、执行效果:

cf8a1ef8b3a08f6786a612d2474bd03b.png

482975b19c27eacf53a2b221e3723a44.png

f19f95a3f38a51934cbfdda46b4c83b4.png

7af155df51e990838a8e7ed2ef0e52af.png

f0a9b9f4b93584491e567f37f3da8b37.png

五、源代码:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值