Struts2拦截器

       Struts2的核心今天都讲完啦,今天给大家讲最后一个重点   ————  拦截器

      拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一段代码,在Action执行之前或之后被调用执行,也可以在一个Action执行前阻止其执行,同时也可以提取Action中可重用部分的方式。通俗一点说,拦截器是一个实现了一定功能的类,它以一种可插拔的方式被定        义在某个Action执行的之前或之后,用来完成特定的功能。

       默认拦截器原理:运用了aop思想和责任链设计模式

      1.aop是一种面向切面编程,在不修改源代码情况下来扩展功能。

        

       责任链模式简单的来说就是执行多个拦截器,一个一个的进行执行,在执行完后进入下一个拦截器之前,前一个的拦截器会做类似于放行的操作。

    拦截器又分为系统拦截器和自定义拦截器两种,现在写来说系统拦截器

     首先要先来个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="token.action" method="post">
12         <s:token></s:token>
13         <s:textfield name="name"></s:textfield>
14         <s:password name="pwd"></s:password>
15         <s:submit value="提交"></s:submit>
16     </s:form>
17 </body>
18 </html>

这里需要导入struts2的标签库<%@ taglib uri="/struts-tags" prefix="s"%>

然后还是跟昨天一样创建一个类并且继承ActionSupport,在用request来获取表单提交的数据,具体如下

 1 package com.action;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 
 5 import org.apache.struts2.ServletActionContext;
 6 
 7 import com.opensymphony.xwork2.ActionSupport;
 8 
 9 public class TokenAction extends ActionSupport {
10 
11     @Override
12     public String execute() throws Exception {
13         HttpServletRequest request = ServletActionContext.getRequest();
14         String name = request.getParameter("name");
15         String pwd = request.getParameter("pwd");
16         System.out.println(name + "----" + pwd);
17         return SUCCESS;
18     }
19 
20 }

当jsp跟action都做好之后就需要在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="mypackage" extends="struts-default">
 8         <action name="login*" class="com.action.LoginAction" method="{1}">
 9             <result name="success">/index.jsp</result>
10         </action>
11     </package>
12 
13 
14     <!-- 系统拦截器 -->
15     <package name="mytoken" extends="struts-default">
16         <action name="token" class="com.action.TokenAction">
17             <!-- 配置令牌 -->
18             <interceptor-ref name="token"></interceptor-ref>
19             <!-- 应用默认拦截器 -->
20             <interceptor-ref name="defaultStack"></interceptor-ref>
21             <result name="success">/success.jsp</result>
22             <result name="invalid.token">/error.jsp</result>
23         </action>
24     </package>
25 
26 
27 </struts>

action标签中添加拦截器
<interceptor-ref name="token" />     name=action的name

反复提交后跳转的错误的位置:
<result name="invalid.token">/error.jsp</result>

<interceptor-ref name="defaultStack" />   

如果你觉得这样系统拦截器就做完了的话,那你就错了,如果是jsp的页面的话你一测试就会报错,因为它无法找到jsp就会报错,所以呢我们还需要去webxml里面去配置一个<filter-mapping>

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app id="WebApp_ID" version="2.4"
 3     xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 5     <display-name>struts2</display-name>
 6     <welcome-file-list>
 7         <welcome-file>index.html</welcome-file>
 8         <welcome-file>index.htm</welcome-file>
 9         <welcome-file>index.jsp</welcome-file>
10         <welcome-file>default.html</welcome-file>
11         <welcome-file>default.htm</welcome-file>
12         <welcome-file>default.jsp</welcome-file>
13     </welcome-file-list>
14  
15     <filter>
16         <filter-name>struts2</filter-name>
17         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
18     </filter>
19 
20     <filter-mapping>
21         <filter-name>struts2</filter-name>
22         <url-pattern>*.action</url-pattern>
23     </filter-mapping>
24 
25 
26     <filter-mapping>
27         <filter-name>struts2</filter-name>
28         <url-pattern>*.jsp</url-pattern>
29     </filter-mapping>
30 
31 
32 </web-app>

到目前为止,系统拦截器才算是做完。

现在开始来说自定义拦截器

自定义拦截器例子:
简单的登录的例子,在action中登录成功写入信息到session中,在自定义的拦截器中来判断session值是不是为空,如果为空需要跳转到登录的界面中

步骤如下:

1.创建类继承MethodFilterInterceptor类

2 重写MethodFilterInterceptor类里面拦截器的方法    重写doIntercept 方法  放行:actionInvocation.invoke();

3 配置action和自定义拦截器直接的关系(注册拦截器)

4 过滤不拦截的方法

这里我就不重复说明了,结合系统拦截器接着说,首先我们需要再来个类

 1 package com.action;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpSession;
 5 
 6 import org.apache.struts2.ServletActionContext;
 7 
 8 import com.opensymphony.xwork2.ActionSupport;
 9 import com.sun.net.httpserver.Authenticator.Success;
10 
11 public class LoginACtionMyInterceptor extends ActionSupport {
12 
13     public String login() {
14         HttpServletRequest request = ServletActionContext.getRequest();
15         String name = request.getParameter("name");
16         String pwd = request.getParameter("pwd");
17         HttpSession session = request.getSession();
18         if ("admin".equalsIgnoreCase(name) && "123456".equals(pwd)) {
19             session.setAttribute("login",name);
20             return SUCCESS;
21         } else {
22             return LOGIN;
23         }
24         
25     }
26 
27 }

在来个创建类继承MethodFilterInterceptor的类

 1 package com.Interceptor;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 
 5 import org.apache.struts2.ServletActionContext;
 6 
 7 import com.opensymphony.xwork2.Action;
 8 import com.opensymphony.xwork2.ActionInvocation;
 9 import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
10 
11 public class MyInterceptor extends MethodFilterInterceptor {
12 
13     @Override
14     protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
15         HttpServletRequest request = ServletActionContext.getRequest();
16         String name = (String) request.getSession().getAttribute("login");
17         if (name != null) {
18             actionInvocation.invoke();
19             return Action.SUCCESS;
20         } else {
21             return Action.LOGIN;
22         }
23 
24     }
25 
26 }

最后在去XMl的里面写配置就OK了,

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <!DOCTYPE struts PUBLIC
 4     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 5     "http://struts.apache.org/dtds/struts-2.3.dtd">
 6 
 7 
 8 <struts>
 9     <package name="mypackage" extends="struts-default">
10         <action name="login*" class="com.action.LoginAction" method="{1}">
11             <result name="success">/index.jsp</result>
12         </action>
13     </package>
14 
15     <!-- 系统拦截器 -->
16     <package name="mytoken" extends="struts-default">
17         <action name="token" class="com.action.TokenAction">
18             <!-- 配置令牌 -->
19             <interceptor-ref name="token"></interceptor-ref>
20             <!-- 应用默认拦截器 -->
21             <interceptor-ref name="defaultStack"></interceptor-ref>
22             <result name="success">/succes.jsp</result>
23             <result name="invalid.token">/error.jsp</result>
24         </action>
25     </package>
26 
27 
28     <!-- 自定义拦截器 -->
29     <package name="mylogin" extends="struts-default">
30         <interceptors>
31             <interceptor name="MyInterceptor" class="com.Interceptor.MyInterceptor">
32                 <!-- 排除法 -->
33                 <param name="excludeMethods">login</param>
34             </interceptor>
35         </interceptors>
36         <action name="adminlogin*" class="com.action.LoginACtionMyInterceptor"
37             method="{1}">
38             <interceptor-ref name="MyInterceptor"></interceptor-ref>
39             <interceptor-ref name="defaultStack"></interceptor-ref>
40             <result name="success">/success.jsp</result>
41             <result name="login">/interceptor.jsp</result>
42         </action>
43     </package>
44 
45 
46 
47 
48 </struts>

最后可能因为本人原因可能有些地方没有讲清楚所以,最后奉上图片一张,

     Struts2 的核心就讲完啦,这是小弟刚刚接触到博客园哪里写的不够清楚不够详细,请大家在下方评论,以后会慢慢改正,谢谢大家。

原文地址:https://www.cnblogs.com/cqc666/p/7739285.html