一、拦截器,拦截器栈

1、拦截器的作用

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

2、拦截器执行顺序

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

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

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

3、自定义拦截器

  1) 声明一个拦截器

  1. <pacakge >
  2.  
  3. <interceptors>
  4. <interceptor name="LoginInterceptor" class="interceptor.LoginInterceptor">
  5. </interceptor>
  6. </interceptors>
  7.  
  8. <action ></action>
  9. </package>

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

2)引用一个拦截器:

  1. <action>
  2. <!-- 引用自定义的拦截器 -->
  3. <interceptor-ref name="LoginInterceptor"></interceptor-ref>
  4. <action>

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

4、自定义拦截器栈

1)声明一个拦截器

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

  1. <interceptors>
  2. <interceptor name="LoginInterceptor" class="interceptor.LoginInterceptor"></interceptor>
  3.  
  4. <interceptor-stack name="amosStack">
  5. <interceptor-ref name="LoginInterceptor"></interceptor-ref>
  6. <interceptor-ref name="defaultStack"></interceptor-ref>
  7. </interceptor-stack>
  8.  
  9. </interceptors>

2)引用一个拦截器栈:

  1. <!-- 引用自定义的拦截器栈 -->
  2. <interceptor-ref name="amosStack"></interceptor-ref>

二、需求分析

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

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

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

三、代码分析:

upload.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <s:form action="UploadAction" enctype="multipart/form-data" method="POST">
  12. <s:textfield label="上传用户" name="username"/>
  13. <s:file label="上传文件" name="upload" />
  14. <s:file label="上传文件" name="upload" />
  15. <%-- <s:file label="上传文件" name="upload" /> --%>
  16.  
  17. <s:submit value="提交"/>
  18. </s:form>
  19. </body>
  20. </html>

upload_success.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <s:form action="UploadAction" enctype="multipart/form-data" method="POST">
  12. <s:textfield label="上传用户" name="username"/>
  13. <s:file label="上传文件" name="upload" />
  14. <s:file label="上传文件" name="upload" />
  15. <%-- <s:file label="上传文件" name="upload" /> --%>
  16.  
  17. <s:submit value="提交"/>
  18. </s:form>
  19. </body>
  20. </html>

login.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib uri="/struts-tags" prefix="s"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>login</title>
  9. </head>
  10. <body>
  11. <s:form action="LoginAction" method="POST">
  12. <s:textfield label="上传用户" name="username"/>
  13. <s:submit value="登录"/>
  14. </s:form>
  15. </body>
  16. </html>

login_success.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>login success</title>
  8. </head>
  9. <body>
  10. 登录成功<br>
  11. <%-- ${pageContext.request.contextPath } --%>
  12. <a href="upload.jsp" >返回上传页面</a>
  13. </body>
  14. </html>

sturts.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <!-- <include file="config/upload.xml"></include>
  8. -->
  9. <!-- 加载其他配置文件 -->
  10. <include file="config/upload-interceptor.xml"></include>
  11. </struts>

upload-sturts.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <package name="login" extends="struts-default">
  8. <action name="LoginAction" class="interceptor.LoginAction"
  9. method="loginMethod">
  10. <result>
  11. /login_success.jsp
  12. </result>
  13. </action>
  14. </package>
  15. <package name="upload" extends="struts-default">
  16. <interceptors>
  17. <interceptor name="LoginInterceptor" class="interceptor.LoginInterceptor"></interceptor>
  18.  
  19. <interceptor-stack name="amosStack">
  20. <interceptor-ref name="LoginInterceptor"></interceptor-ref>
  21. <interceptor-ref name="defaultStack"></interceptor-ref>
  22. </interceptor-stack>
  23.  
  24. </interceptors>
  25.  
  26. <action name="UploadAction" class="action.UploadAction" method="uploadMethod">
  27. <param name="uploadPath">/home/amosli/develop/struts2_learn/</param>
  28. <result name="success" type="dispatcher">
  29. /WEB-INF/upload_success.jsp
  30. </result>
  31. <result name="input" type="dispatcher">
  32. upload.jsp
  33. </result>
  34. <result name="toLoginJsp" type="dispatcher">
  35. login.jsp
  36. </result>
  37. <!-- 对系统的拦截器进行设置 -->
  38. <interceptor-ref name="fileUpload">
  39. <!-- 对单个上传文件的大小进行设置,5M -->
  40. <param name="maximumSize">5242880</param>
  41. <!-- 对允许的文件扩展名进行设置,这里以英文逗号隔开 -->
  42. <param name="allowedExtensions">.txt,.xml</param>
  43. <!-- 对允许的文件类型进行设置,这里以英文逗号进行隔开 -->
  44. <param name="allowedTypes">text/plain,text/xml</param>
  45. </interceptor-ref>
  46. <!-- 引用自定义的拦截器 -->
  47. <!-- <interceptor-ref name="LoginInterceptor"></interceptor-ref> --> <!-- 显示引用默认的拦截器 -->
  48. <!-- <interceptor-ref name="defaultStack"></interceptor-ref> -->
  49.  
  50. <!-- 引用自定义的拦截器栈 -->
  51. <interceptor-ref name="amosStack"></interceptor-ref>
  52.  
  53. </action>
  54. </package>
  55. </struts>

LoginAction.java

  1. package interceptor;
  2.  
  3. import java.util.Map;
  4.  
  5. import com.opensymphony.xwork2.ActionContext;
  6. import com.opensymphony.xwork2.ActionSupport;
  7.  
  8. /**
  9. * @ClassName: LoginAction
  10. * @Description: 用户登录
  11. * @author: amosli
  12. * @email:amosli@infomorrow.com
  13. * @date Jan 17, 2014 12:11:35 AM
  14. */
  15. public class LoginAction extends ActionSupport {
  16. private static final long serialVersionUID = 3514444221760688282L;
  17.  
  18. private String username;
  19.  
  20. public void setUsername(String username) {
  21. this.username = username;
  22. }
  23.  
  24. public String loginMethod() {
  25. // 取得HTPPSession
  26. Map<String, Object> session = ActionContext.getContext().getSession();
  27.  
  28. session.put("username", username);
  29. return SUCCESS;
  30. }
  31.  
  32. }

LoginInterceptor.java

  1. package interceptor;
  2.  
  3. import java.util.Map;
  4.  
  5. import action.UploadAction;
  6.  
  7. import com.opensymphony.xwork2.ActionContext;
  8. import com.opensymphony.xwork2.ActionInvocation;
  9. import com.opensymphony.xwork2.interceptor.Interceptor;
  10.  
  11. /**
  12. * @ClassName: LoginInterceptor
  13. * @Description: 登录拦截器
  14. * @author: amosli
  15. * @email:amosli@infomorrow.com
  16. * @date Jan 17, 2014 11:42:54 PM
  17. */
  18. public class LoginInterceptor implements Interceptor {
  19.  
  20. private static final long serialVersionUID = 8314579656513662711L;
  21.  
  22. public LoginInterceptor() {
  23. System.out.println("LoginInterceptor():" + this.hashCode());
  24. }
  25.  
  26. public void destroy() {
  27. System.out.println("destroy()");
  28. }
  29.  
  30. public void init() {
  31. System.out.println("init()");
  32. }
  33.  
  34. public String intercept(ActionInvocation invocation) throws Exception {
  35. System.out.println("LoginInterceptor");
  36. // //获取此拦截器将要拦截的action
  37. // Object action = invocation.getAction();
  38. // System.out.println("action:"+action);//action:action.UploadAction@6522cf92
  39. // //获取action的返回值
  40. // String resultValue = invocation.invoke();
  41. // System.out.println("resultValue:"+resultValue);// resultValue:success
  42.  
  43. // 如果拦截器将要拦截的action为UploadAction,那么判断用户是否已经登录
  44. if (invocation.getAction() instanceof UploadAction) {
  45. Map<String, Object> session = ActionContext.getContext().getSession();
  46. if (session.get("username") != null) {// 判断用户是否已经登录
  47. // 如果返回值为"success"那么将会匹配到配置文件中为result属性为"success"的内容。
  48. // 如果返回值为invocation.invoke(),那么将会执行uploadaction方法
  49. return invocation.invoke();
  50. } else {
  51. return "toLoginJsp";
  52. }
  53. }
  54.  
  55. return null;
  56. }
  57.  
  58. }

UploadAction.java

  1. package action;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8.  
  9. import com.opensymphony.xwork2.ActionSupport;
  10.  
  11. /**
  12. * @ClassName: UploadAction
  13. * @Description: 文件上传
  14. * @author: amosli
  15. * @email:amosli@infomorrow.com
  16. * @date Jan 14, 2014 1:50:28 AM
  17. */
  18. public class UploadAction extends ActionSupport {
  19. private static final long serialVersionUID = -8920466592471253212L;
  20. private String username;// 用户名
  21. private String[] uploadContentType;// 上传文件的类型,(Fileupload拦截器传入的参数)
  22. private File[] upload;// 上传的文件,(Fileupload拦截器传入的参数)
  23. private String[] uploadFileName;// 上传文件的真实文件名,(Fileupload拦截器传入的参数)
  24. private String uploadPath;
  25.  
  26. public void setUploadPath(String uploadPath) {
  27. this.uploadPath = uploadPath;
  28. }
  29.  
  30. public void setUsername(String username) {
  31. this.username = username;
  32. }
  33.  
  34. public String[] getUploadContentType() {
  35. return uploadContentType;
  36. }
  37.  
  38. public void setUploadContentType(String[] uploadContentType) {
  39. this.uploadContentType = uploadContentType;
  40. }
  41.  
  42. public File[] getUpload() {
  43. return upload;
  44. }
  45.  
  46. public void setUpload(File[] upload) {
  47. this.upload = upload;
  48. }
  49.  
  50. public String[] getUploadFileName() {
  51. return uploadFileName;
  52. }
  53.  
  54. public void setUploadFileName(String[] uploadFileName) {
  55. this.uploadFileName = uploadFileName;
  56. }
  57.  
  58. public String getUsername() {
  59. return username;
  60. }
  61.  
  62. public String uploadMethod() throws Exception {
  63. // ServletContext context = ServletActionContext.getServletContext();
  64. // String real_path = context.getRealPath("/WEB-INF/upload/");
  65. for (int i = 0; i < upload.length; i++) {
  66. InputStream inputStream = new FileInputStream(upload[i]);
  67. OutputStream outputStream = new FileOutputStream(uploadPath + "/" + uploadFileName[i]);
  68. byte[] b = new byte[1024];
  69. int len = 0;
  70. while ((len = inputStream.read(b)) > 0) {
  71. outputStream.write(b, 0, len);
  72. }
  73. // 关闭流
  74. inputStream.close();
  75. outputStream.close();
  76. // 删除tmp文件,最好是用tyrcatch finally进行删除
  77. // upload[i].delete();
  78. }
  79.  
  80. return SUCCESS;
  81. }
  82.  
  83. }

其中文件上传的代码主要引用上一篇文章中的,所以这里主要讲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的配置也是细节问题,主要可以参考文章开头的内容。

四、执行效果:

五、源代码:

https://github.com/amosli/strut2_learn  sturts2拦截器、拦截器栈学习

java struts2入门学习---拦截器学习的更多相关文章

  1. SpringMVC—Struts2拦截器学习网址整理

    引自:http://blog.csdn.net/wp1603710463/article/details/49982683 SpringMVC—Struts2拦截器学习网址整理 最近项目中遇到权限相关 ...

  2. java struts2入门学习实例--使用struts2快速实现上传

    一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...

  3. Struts2学习-拦截器

    1.新建项目user4,建立好和user3一样的目录,与之相比只是添加几个类,主要是struts.xml和action类的改变,其结果没有太大的变化 struts,xml <?xml versi ...

  4. Struts2学习-拦截器2续

    定义拦截器有2种办法:1.实现Interceptor接口2.集成AbstractInterceptor抽象类 一.方法1 ..... <struts> <package name=& ...

  5. 《java从入门到精通》学习记录

    目录 <Java从入门到精通>学习记录 3 基础的基础部分: 3 一. 常量与变量 3 1. 掌握: 3 (1) .常量与变量的声明方式: 3 (2) .变量的命名规则: 3 (3) .变 ...

  6. 5.Struts2中的拦截器

    拦截器是Struts2中的核心,其自带很多很多的拦截器,这里主要介绍一下自定义拦截器,恩多一半情况下呢?我们不需要使用到自定义的拦截器,Struts2本身已经提 供了很多的拦截器供我们使用,对于自定义 ...

  7. Struts2(十四)拦截器实现权限管理

    一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...

  8. Java实战之01Struts2-04拦截器、上传下载、OGNL表达式

    十二.Struts2中的拦截器 1.拦截器的重要性 Struts2中的很多功能都是由拦截器完成的.比如:servletConfig,staticParam,params,modelDriven等等. ...

  9. Struts2透过自定义拦截器实现登录之后跳转到原页面

    Struts2通过自定义拦截器实现登录之后跳转到原页面 这个功能对用户体验来说是非常重要的.实现起来其实很简单. 拦截器的代码如下: package go.derek.advice; import g ...

随机推荐

  1. Android -- startActivityForResult和setResult

    startActivityForResult与startActivity的不同之处 startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivit ...

  2. 知乎:GAN 的发展对于研究通用人工智能有什么意义?

    https://www.zhihu.com/question/57668112/answer/155367561 Lyken 愿以有涯随无涯 收录于 编辑推荐知乎圆桌 · 296 人赞同了该回答 资历 ...

  3. 用php实现交互式工具——How do I write a command-line interactive PHP script?

    I want to write a PHP script that I can use from the command line. I want it to prompt and accept in ...

  4. Cognos11第三方权限认证之OpenDJ

      一.安装OpenDJ 安装java环境,配置OPENDJ_JAVA_HOME环境变量指向java,然后傻瓜安装,出现下面的界面则说明安装成功 注意安装的过程中会指定管理用户cn的密码,默认的cn是 ...

  5. LNMP(Linux+Nginx+MySQL+PHP)centos6.4安装

    nginx命令 停止nginx服务:# /etc/init.d/nginx stop 启动nginx服务:# /etc/init.d/nginx start 编辑nginx配置文件:# vim /et ...

  6. Android Studio:xxx is not an enclosing class 错误的解决方法

    Android Studio:xxx is not an enclosing class 错误的解决方法 这个问题一般出现在内部类中,若要创建内部类的实例,需要有外部类的实例才行,或者是将内部类设置为 ...

  7. Redis开发 - 1. 认识redis

    1. 什么是Redis? Redis is a very fast non-relational database that stores a mapping of keys to five diff ...

  8. MySQL事物系列:3:innodb_flush_log_at_trx_commit小实验

    1:创建表和存储过程 mysql> create database trx; Query OK, 1 row affected (0.02 sec) mysql> USE trx Data ...

  9. unity3d uv动画

    做个总结吧.算是. 之前做过一个项目,是一个关于太空大战的项目. 算是自己做的吧.大体环境是unity3d + win32,mac上不行.好像不支持这个,原因未知.希望知道的告诉我下. 以下具体说下整 ...

  10. tensorflow serving 编写配置文件platform_config_file的方法

    1.安装grpc gRPC 的安装: $ pip install grpcio 安装 ProtoBuf 相关的 python 依赖库: $ pip install protobuf 安装 python ...