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

  • 相关阅读:
    分布式事务04JTA+Atomikos
    【二】认识一下鱼缸里四个阶段的水质
    【三】鱼爷到家如何接驾(漫画版)?正确放鱼5步曲……
    【一】【干货】7个养鱼路上的灾难,32条应急挽救+避免办法
    Elasticsearch使用系列Docker搭建Elasticsearch集群
    Elasticsearch使用系列ES简介和环境搭建
    .Net Core(.NET6)中接入Log4net和NLog进行日志记录
    Elasticsearch使用系列基本查询和聚合查询+sql插件
    .Net Core中无处不在的Async/Await是如何提升性能的?
    Elasticsearch使用系列.NET6对接Elasticsearch
  • 原文地址:https://www.cnblogs.com/cqc666/p/7739285.html
Copyright © 2020-2023  润新知