• Struts2拦截器


    拦截器

    拦截器分类:1) struts框架自带拦截器:
    sturts-default.xml文件中里有多种拦截器如params.......等,
    在struts.xml中只要包extends了struts-default,那么每个Action都拥有一些拦截器,拥有的这些叫默认拦截器栈defaultStack
    2) 自定义拦截器(权限控制等)

    如何自定义拦截器:
    1)
    com.opensymphony.xwork2.interceptor.Interceptor接口 ----------> (只有init,destroy,intercept方法)

    要实现接口里的三个方法:
    public void destroy(){}
    public void init(){}
    public String intercept(ActionInvocation invocation) throws Exception {

    String result = invocation.invoke();


    2)
    com.opensymphony.xwork2.interceptor.AbstractInterceptor 抽象类 ---------->(只有intercept方法)
    public String intercept(ActionInvocation invocation)throws Exception {

    String result = invocation.invoke();

    3)com.opensymphony.xwork2.interceptor.MethodFilterInterceptor抽象类 ----------> (这个拦截器可以指定要拦截或不拦截的方法列表)

    protected String doIntercept(ActionInvocation arg0) throws Exception {

    String result=arg0.invoke();

    Struts.xml中配置:

    <struts>
    <package name="hello1" extends="struts-default">
    
    <interceptors>
    <interceptor name="interceptorDemo" class="interceptor.InterceptorDemo">
    <param name="time">300</param>
    </interceptor>
    <interceptor name="abstractInterceptorDemo" class="interceptor.AbstractInterceptorDemo"></interceptor>
    <interceptor name="methodFilterInterceptorDemo" class="interceptor.MethodFilterInterceptorDemo"></interceptor>
    </interceptors>
    
    <action name="loginAction_*" class="action.LoginAction" method="{1}">
    
    <result name="success">/index.jsp</result>
    <result name="final">/login.jsp</result>
    
    <interceptor-ref name="interceptorDemo"></interceptor-ref>
    <interceptor-ref name="abstractInterceptorDemo"></interceptor-ref>
    <interceptor-ref name="methodFilterInterceptorDemo">
    <param name="includeMethods">login2</param>
    <!--
    对LoginAction中的execute方法进行拦截
    -->
    <param name="excludeMethods">login1,login3</param>
    <!--
    对LoginAction中的MyExecute方法不进行拦截
    -->
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    
    </action>
    
    </package>
    
    
    </struts>


    注意:1)多个拦截器作用于一个Action,拦截器是有顺序的

    2)设置拦截器或不拦截的方法时,如果有多个方法,那么以逗号(,)分隔,
    如果一个方法的名字同时出现在execludeMethods和includeMethods参数中,那么它会被当作要拦截的方法。
    也就是说, includeMethods优先于execludeMethods。

     拦截器栈:就是将一些拦截器组合起来进行统一管理

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
    <package name="hello1" extends="struts-default">
    
    <interceptors>
    <interceptor name="interceptorDemo" class="interceptor.InterceptorDemo">
    <param name="time">300</param>
    </interceptor>
    <interceptor name="abstractInterceptorDemo" class="interceptor.AbstractInterceptorDemo"></interceptor>
    <interceptor name="methodFilterInterceptorDemo" class="interceptor.MethodFilterInterceptorDemo"></interceptor>
    <!-- 拦截器栈1 -->
    <interceptor-stack name="one">
    <interceptor-ref name="interceptorDemo"></interceptor-ref>
    <interceptor-ref name="abstractInterceptorDemo"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
    <!-- 拦截器栈2 -->
    <interceptor-stack name="two">
    <interceptor-ref name="methodFilterInterceptorDemo">
    <param name="includeMethods">login2</param>
    <param name="excludeMethods">login1,login3</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
    
    </interceptors>
    
    <action name="loginAction_*" class="action.LoginAction" method="{1}">
    <result name="success">/index.jsp</result>
    <result name="final">/login.jsp</result>
    
    <interceptor-ref name="one"></interceptor-ref>
    <interceptor-ref name="two"></interceptor-ref>
    </action>
    
    </package>
    
    
    </struts>


    拦截器的应用
    1.访问权限拦截器

    1)JSP
    2)Action:获取页面上的数据,验证成功后,把用户信息存入session中,然后跳转到另一个Action
    3)对另一个Action进行拦截,从session中取值,判断用户是否登录,在进行跳转
    4)为什么写二个Action,因为,第一个Action是为了往session中放值,如果是后拦截不起作用。所以得用第二个Action
    5)struts.xml要对第二个Action配置上拦截器
    6)访问权限为什么非写在拦截器里:为了重用(有可能其它Action也要用)

    使用令牌token防止表单重复提交

    1)index.jsp

    <%@ taglib prefix="s" uri="/struts-tags"%>
    <body>
    <form action="login">
    
    username:
    <input type="text" name="username" />
    <br>
    password:
    <input type="password" name="password" />
    <br>
    <s:token></s:token>
    <!-- GR8JKKSN5YMG1GY5VA35NOZ40HE4QA1A -->
    <input type="submit" value="提交">
    
    </form>
    </body>

    2)action

    //action类是需要继承ActionSupport这个类的,不然struts识别不了
    //在重复提交时,Token会产生一个重复的提交的信息,由ActionSupport得到信息后,在存入TokenAction这个类中
    public class TokenAction extends ActionSupport {
    
    public String execute() throws Exception {
    
    return SUCCESS;
    }
    
    }

    3)struts.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
    
    <!-- i18n这个常量的值是什么,这个值是当前默认文件的相对路径,但是不带后缀
    当无其它国际化配置文件时,使用默认配置文件 -->
    <constant name="struts.custom.i18n.resources" value="action.resourc"></constant>
    
    
    <package name="action" namespace="/" extends="struts-default">
    <action name="tokenAction" class="action.TokenAction">
    <result name="success" >/welcome.jsp</result>
    
    <!-- name="invalid.token" 表单重复提交就转到此页面,并提示用户已重复提交 -->
    <result name="invalid.token" >/error.jsp</result>
    
    <!-- 为action引入token拦截器 -->
    <interceptor-ref name="token"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    </action>
    
    </package>
    </struts>
  • 相关阅读:
    bnuoj 4207 台风(模拟题)
    bnuoj 4208 Bubble sort
    bnuoj 4209 Triangle(计算几何)
    bnuoj 33656 J. C.S.I.: P15(图形搜索题)
    bnuoj 33648 Neurotic Network(树形模拟题)
    bnuoj 33647 Angry Grammar Nazi(字符串)
    bnuoj 16493 Just Pour the Water(矩阵快速幂)
    Solidity合约记录——(三)如何在合约中对操作进行权限控制
    预赛第二场
    预赛第一场
  • 原文地址:https://www.cnblogs.com/lm970585581/p/7246716.html
Copyright © 2020-2023  润新知