`
mxyzdl1234
  • 浏览: 3712 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

NoParameters接口的使用

 
阅读更多
今天从同事那里了解到一个接口 org.apache.struts2.interceptor.NoParameters,之前从来没用过,私下研究了一下觉得很有用,记下来留作以后参考:
NoParameters.java,源码附上:
package org.apache.struts2.interceptor;
/**
 * This marker interface should be implemented by actions that do not want any parameters set on
 * them automatically. This may be useful if one is using the action tag and want to supply
 * the parameters to the action manually using the param tag. It may also be useful if one for
 * security reasons wants to make sure that parameters cannot be set by malicious users.
 *
 */
public interface NoParameters extends com.opensymphony.xwork2.interceptor.NoParameters 
{
}


注释的意思是说实现该接口的Action类,不会对任何参数自动赋值,却支持手动赋值,那么我们在什么情况下不需要struts替我们自动赋值请求参数呢?下面再看一个拦截器:
ParametersInterceptor.java,源码附上:

@Override
    public String doIntercept(ActionInvocation invocation) throws Exception {
        Object action = invocation.getAction();
        if (!(action instanceof NoParameters)) {
            ActionContext ac = invocation.getInvocationContext();
            final Map<String, Object> parameters = retrieveParameters(ac);
            if (LOG.isDebugEnabled()) {
                LOG.debug("Setting params " + getParameterLogMap(parameters));
            }
            if (parameters != null) {
                Map<String, Object> contextMap = ac.getContextMap();
                try {
                    ReflectionContextState.setCreatingNullObjects(contextMap, true);
                    ReflectionContextState.setDenyMethodExecution(contextMap, true);
                    ReflectionContextState.setReportingConversionErrors(contextMap, true);
                    ValueStack stack = ac.getValueStack();
                    setParameters(action, stack, parameters);
                } finally {
                    ReflectionContextState.setCreatingNullObjects(contextMap, false);
                    ReflectionContextState.setDenyMethodExecution(contextMap, false);
                    ReflectionContextState.setReportingConversionErrors(contextMap, false);
                }
            }
        }
        return invocation.invoke();
    }

    从ParameterInterceptor可以看到,如果Action类没有实现NoParameters接口,且此时的日志模式为debug,那么ParameterInterceptor拦截器会把所有的请求参数打印出来,打印请求参数这原本是件好事,可以有助于开发人员及时定位问题。但是如果请求参数中包含明文的密码时,那么用户的密码就会暴露在日志文件中,从而被有权限的查看日志的人窃取到密码。
    项目中请求走的是https协议,项目的安全官认为https协议会对报文整体进行加密,所以对于 请求参数包含密码的这种情况,没有必要对密码再次加密,所以导致密码明文传到后台。
    这个时候NoParameters就起作用了,只要将Action实现NoParameters接口,那么执行到 ParameterInterceptor时就会跳过打印请求参数的分支,此时Action中的参数不支持自动赋值,倒是可以通过request.getParameter的方式获取到请求参数。

附加内容:
       源码中有一段很奇怪的代码:
 if (LOG.isDebugEnabled()) {
    LOG.debug("Setting params " + getParameterLogMap(parameters));
}


如果日志级别高于debug,debug日志内容是不会打出来的,那么为什么还要在打印debug日志前要做是否为debug模式的判断呢?
       原来是出于性能的考虑, 如果没有了debug级别的预判,无论此时日志级别是否为debug,getParameterLogMap方法都是被执行的。那么以后对于打印日志的内容比较耗性能,就有必要在打印前做日志级别的预判。
分享到:
评论

相关推荐

    支付宝批量付款到支付宝账号接口集成教程ASP版本

    4. **参数构造**:根据接口文档,我们需要构建一系列参数,如`service`(服务名)、`partner`(商户ID)、`payment_type`(支付类型)、`batch_no`(批次号)、`batch_num`(付款条目数)、`out_trade_no`(订单号)...

    支付宝即时分润接口文档

    总的来说,支付宝即时分润接口是实现多方资金结算的重要工具,商家需要理解并正确使用接口参数,遵循签名规则,以及妥善处理可能出现的错误,确保分润操作的顺利进行。在开发过程中,应仔细阅读官方文档,理解各项...

    即时到账交易接口(create_direct_pay_by_user)1

    请求参数说明部分详细列出了每个参数的作用,例如`out_trade_no`代表商户订单号,`subject`表示订单标题,`total_amount`则指定了交易金额。 4.2 列表: 参数列表通常以表格形式展示,包括参数名、参数类型、是否...

    即时到账分账接口参数和实例文档

    #### 接口使用场景 - **电商领域**:适用于电商平台内部商家之间的结算。 - **服务外包**:适用于服务外包平台向服务商和平台运营者之间的收益分配。 - **多级分销体系**:适用于多级分销网络中的佣金分配。 #### ...

    ado.rar_ado数据库接口_ado源代码

    在本文中,我们将深入探讨ADO数据库接口及其源代码,以及如何在VC++环境中使用它们。 **ADO的核心概念** 1. **Connection对象**:这是与数据库建立连接的基础,它包含了数据库的连接字符串、登录凭据等信息。通过...

    fcm_game_go:网络游戏防沉迷实名认证,使用测试码通过所有的测试案例,以及正式接口的调用

    需要通过所有的测试案例,测试案例会有测试码,全部通过以后才可以使用正式接口地址 package fcm import ( "encoding/json" "io/ioutil" "net/http" "net/url" "testing" "time" ) func TestCheck ( t * ...

    PHP微信支付WxPayPubHelper

    * postXmlSSLCurl(),使用证书,以post方式提交xml到对应的接口url */ include_once("SDKRuntimeException.php"); include_once("WxPay.pub.config.php"); /** * 所有接口的基类 */ class Common_util_pub { ...

    VC++下使用ADO编写数据库程序

    - **\no_namespace**:指定不使用命名空间 ADODB{},使所有内容成为全局作用域。 - **\rename ("EOF", "adoEOF")**:为了避免与 C 语言标准库中的 `EOF` 宏冲突,将 ADO 中的 `EOF` 改名为 `adoEOF`。 #### 三、...

    CISCO 技术大集合

    通过使用可变长的子网掩码可以让位于不同接口的同一网络编号的网络使用不同的掩码,这样可以节省IP地址,充分利用有效的IP地址空间。 如下图所示: Router1和Router2的E0端口均使用了C类地址192.1.0.0作为网络地址,...

    海思hi3536开发板QT鼠标事件捕获,鼠标移动new.docx

    在海思hi3536开发板上,需要在/etc/profile中设置环境变量QT_QPA_EVDEV_MOUSE_PARAMETERS='/dev/input/event0',以便QT可以捕获鼠标事件。 三、设备设置 在海思hi3536开发板上,需要设置设备以便QT可以正确地捕获...

    AFNetworking2.5使用Demo

    这个库为开发者提供了易于使用的接口来处理 HTTP 服务,包括请求/响应操作、上传和下载任务、以及管理缓存。在 AFNetworking 2.5 版本中,它继续优化了性能并增加了对更多 HTTP 协议特性的支持。 ### 一、安装与...

    Struts2源码分析之ParametersInterceptor拦截器

    在ActionInvocation的doIntercept方法中,拦截器首先获取当前的Action对象,然后判断它是否实现了NoParameters接口。如果实现了这个接口,那么说明Action不接受任何请求参数,否则就会继续处理参数。 ActionContext...

    pytorch 中的重要模块化接口nn.Module的使用

    1. **_parameters** 字典:存储用户直接创建的`Parameter`对象,这些通常是网络的可学习权重。`Parameter`类是一个特殊的`Tensor`,它会在反向传播时自动计算梯度。 2. **_modules** 字典:包含了所有子`Module`...

    使用ADO.net对象向SQL Server 数据库存入图片

    在.NET开发环境中,ADO.NET是连接数据库的重要工具,它提供了丰富的接口和类库来与数据库进行交互,包括读取、写入数据等操作。当涉及到将图片存储到SQL Server数据库时,我们可以利用ADO.NET的对象和方法来实现。...

    vc++中使用ado方式操作access数据库.pdf

    在VC++中使用ADO(ActiveX Data Objects)操作Access数据库是一种高效且易于上手的方法,尤其适合于不熟悉低层数据库接口如ODBC API、DAO、RDO的开发者。ADO建立在OLE DB之上,提供了简单易用的接口,同时保持了良好的...

    zOS1.9 OS390使用帮助

    首先,需要安装 3270 仿真软件 PCOM(最新 5.7 版),然后配置通信菜单,选择主机类型为 zSeries 或 OS390,接口为 LAN,连接方式为 Telnet3270,链路参数为 IP 地址 127.0.0.1,端口 3270。 2.登录 TSO 时的设置 ...

    LotusDomino学习笔记.doc

    - **ODBC示例**: 展示如何使用LotusScript通过ODBC接口访问关系数据库的具体步骤。 #### 69. Managing JavaScript "popup" windows - **管理方法**: 使用JavaScript或LotusScript来控制弹出窗口的显示和关闭。 ###...

    Forms Developer使用及解决问题

    55. **关闭参数窗口**: 通过REPORT的PARAMETERS-FORM属性设置为NO。 56. **定长输出报表**: 通过调整列宽和行高,实现定长输出。 57. **FORMS 4.5的"宏"**: 宏是FORMS 4.5中的一个重要特性,用于简化代码和实现...

    学习ADO时总结的一些经验

    - 引入ADO库:使用`#import`指令导入ADO类型库,例如`#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")`。 - 创建`Connection`对象:使用`CreateInstance`...

    uart.rar_s3c2410 uart_visual c_串口初始化

    标题 "uart.rar_s3c2410 uart_visual c_串口初始化" 涉及的是在基于S3C2410处理器的...这个过程涉及到底层硬件控制、操作系统驱动以及应用程序接口的使用。了解这些知识对于开发嵌入式系统的串口通信功能至关重要。

Global site tag (gtag.js) - Google Analytics