zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/hellowq/p/9779423.html
Copyright © 2011-2022 走看看