• struts2(三)拦截器


     

     

    拦截器

    需求

    如果要访问某一个action类中的某一个方法的内容,如果是admin用户,则访问,如果不是admin用户,则不能访问。

    实现

    缺点  权限判断的代码和业务逻辑代码混合在一起了

    利用拦截器改进

    实现

    步骤

    1、    编写interceptor

     

    return "error"  跳过action  返回strut.xml中 result结果的页面 

    2、    写一个PvilegeSuperAction

     

    3、    在配置文件中进行配置

     

    详细解析

          

           说明:

           通过该图可以看出:当提交一个url请求时,先执行所有的拦截器(按照声明的从上到下的顺序),再执行action。

           声明一个拦截器

              

       

           声明一个拦截器栈

     

          既可以引用一个拦截器

          

           也可以引用一个拦截器栈

                

      真正的做法:建立一个package只方拦截器 然后其他的package继承这个package

          

     

    如果p包继承了privilege包就把所有的新的拦截器栈继承过来了,如果没有继承,则执行默认的拦截器栈

    拦截器的优点

    1、  把项目中一些经常用到的业务逻辑从action中分离出来,写到拦截器中

    这样可以做到这些常用的逻辑和真正的逻辑的松耦合

    2、  拦截器和action是真正的松耦合了

    3、  Struts2把开发过程中的一些常用的业务已经封装到各个拦截器中了

    案例2

     

    拦截器的应用

     属性驱动

    parameter拦截器

     

    利用对象栈的原理

    注意事项:

    1、  必须使用struts2默认的拦截器栈中的ParametersInterceptor

    2、  Action中的属性和表单中的name属性的值保持一致

    3、  利用valueStack.setValue方法可以赋值了

    如有form表单太多,那么action里的属性变量太多引出模型驱动

     模型驱动

    1.  模型驱动: 
             模型驱动是使用javaBean对象来封装请求参数,在整个MVC流程中可以直接使用这个对象。在发送请求后Struts将各个请求参数(javab的属性)封装到一个JavaBean对象中,Action接收这个实例对象并用该对象进行相关处理返回处理结果。 
             模型驱动的Action中定义javaBean并实例化,并且需要提供该JavaBean的getter和setter方法。Action需要实现ModelDriven接口。

    从上图可以看出,ModelDriverInterceptor有两个作用:

    1、  当前请求的action必须实现ModelDriver接口

    2、  把model对象放入到了栈顶

     格式校验拦截器

    validationIntercepter

    防止表单重复提交
    1、原理
    利用了struts2内置的拦截器token实现的
    <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
    2、步骤
    1、在要提交的表单页面上,要写一个struts2自定义的标签:
    <s:form action="../tokenAction_token.action">
    <s:token></s:token>//生成一大堆字符串,用于往session中存放
    用户名:<s:textfield name="username"></s:textfield>
    密码:<s:password name="password"></s:password>
    <s:submit></s:submit>
    </s:form>
    2、在配置文件中,由于在defaultStack中没有把token包括进来,所以
    <interceptors>
    <interceptor-stack name="tokenInterceptor">
    <interceptor-ref name="token">
    //哪些方法可以防止重复提交,如果有很多方法,则用,隔开
    <param name="includeMethods">token</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="tokenInterceptor"></default-interceptor-ref>
    说明:
    1、上面的配置新定义了一个拦截器栈
    2、在拦截器栈中把默认的拦截器栈加了进来
    <interceptor-ref name="defaultStack"></interceptor-ref>
    3、在这个拦截器栈中把token也加了进来,并且指明了哪些方法需要用到防止重复提交
    <interceptor-ref name="token">
    //哪些方法可以防止重复提交,如果有很多方法,则用,隔开
    <param name="includeMethods">token</param>
    </interceptor-ref>
    4、把新定义的拦截器栈tokenInterceptor成了默认的拦截器栈
    3、如果表单重复提交了,将指向invalid.token的错误页面
    <result name="invalid.token">token/error.jsp</result>
    4、如果只执行了上述的内容,报错信息将是一个英文信息, 变成中文信息,步骤如下:
    1、 在struts2的配置文件中,加入自定义资源文件的配置
    <constant name="struts.custom.i18n.resources" value="com.itheima.struts2.resource.token"></constant>
    说明:引入了一个资源文件:为com/itheima/struts2/resource/token.properties
    2、在该资源文件中
    struts.messages.invalid.token=u4E0Du80FDu91CDu590Du63D0u4EA4u8868u5355
    说明:key值保持不变,value是输出的错误信息

    10、文件的上传
    1、原理:
    在struts2中,利用拦截器fileUpload实现了文件上传
    2、实现步骤
    1、在页面上
    <s:form action="uploadAction_upload.action" enctype="multipart/form-data">
    <s:file name="resource"></s:file>
    <s:submit></s:submit>
    </s:form>
    说明:enctype="multipart/form-data"是必须的,说明要上传的文件是以二进制流的形式传递的
    2、在文件上传的action中,要有一个属性resource,属性的类型为File
    public class UploadFileAction{
    private File resource;
    //set和get方法
    }
    3、写一个帮助类,可以把resource文件上传到服务器上的某一个地方
    4、详情:
    1、可以控制文件上传的大小
    1、在default.properties文件中,有这样一个配置
    struts.multipart.maxSize=2097152
    说明文件上传的默认的最大的值为2M
    2、如果要改变其默认值,在配置文件中,设置如下的配置
    <constant name="struts.multipart.maxSize" value="8097152"></constant>
    把文件上传的最大值改为8M
    2、可以控制文件的类型和扩展名
    1、在action中,可以显示文件的类型和扩展名
    1、在action中可以设置如下的属性
    resourceContentType 该属性的名称的组成为{name}ContentType
    2、在action中可以设置如下的属性
    resourceFileName 该属性的名称的组成为{name}FileName

    拦截器源码中名字


    2、在配置文件中
    引入拦截器fileUpload
    <interceptor-ref name="defaultStack">
    <!--
    允许上传的文件的最大size
    -->
    <param name="fileUpload.maximumSize">8097152</param>
    <!--
    允许上传文件的扩展名
    -->
    <param name="fileUpload.allowedExtensions">txt,doc,pdf,jpg</param>
    <!--
    允许上传文件的类型
    -->
    <param name="fileUpload.allowedTypes">application/msword</param>
    </interceptor-ref>
    说明:
    1、因为拦截器在默认的栈中,所以只需要引入默认的栈就可以了
    2、在这里可以通过param给默认栈的fileUpload拦截器的属性赋值
    所以maximumSize,allowedExtensions,allowedTypes都是拦截器fileUpload的属性
    3、如果大小、后缀名、扩展名不符合要求,则会报错,系统会跳转到input指向的页面
    <result name="input">error.jsp</result>,在error.jsp中编写<s:fielderror></s:fielderror>,就可以看到错误信息
    但是,报错的信息是英文的信息,如上传的时候类型错误的信息:
    Content-Type not allowed: upload "xwork-2.1.6-src.zip" "upload_6fff0830_13174e12471__8000_00000000.tmp" application/x-zip-compressed
    该信息的组成(org.apache.struts2):struts-messages.properties
    struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
    struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
    struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}
    {0}:代表页面上<input name="upload" type="file"/>中的name的值
    {1}:代表文件上传的名称
    {2}:文件保存在临时目录的名称。临时目录为workCatalinalocalhoststruts2
    {3}:代表文件上传类型,或者文件上传大小。上面的错误代表文件上传类型。如果报第一个错误,则代表文件上传大小。
    怎么样变成中文的信息呢?
    步骤:
    1、 建立一个properties文件。这个文件的名称可以任意取。
    2、 在这个配置文件中,添入如下的内容:
    struts.messages.error.file.too.large=文件超过了规定的大小: {0} "{1}" "{2}" {3}
    struts.messages.error.content.type.not.allowed=该类型不允许被上传: {0} "{1}" "{2}" {3}
    struts.messages.error.file.extension.not.allowed=不能上传该扩展名类型的文件: {0} "{1}" "{2}" {3}
    3、 在struts-upload.xml中,指定配置文件的位置
    <constant name="struts.custom.i18n.resources" value="com.itheima.struts2.action.upload.fileuploadmessage"></constant>
    如果配置文件放在src下,则这样指定:
    <constant name="struts.custom.i18n.resources" value="fileuploadmessage"></constant>

  • 相关阅读:
    Build MySQL 5.7.4 in RedHat
    glibc-2.19 之 strlen 实现
    [部署问题列表]
    [数据链路排查]
    VS配置本地IIS以域名访问
    SQL系列函数——数学函数
    面向对象编程的几个原则
    SQL系列函数——字符串函数
    SQL数据类型
    DHtmlx组件获取选中行的某一列对应的值
  • 原文地址:https://www.cnblogs.com/hellowq/p/9779423.html
Copyright © 2020-2023  润新知