今天从同事那里了解到一个接口 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方法都是被执行的。那么以后对于打印日志的内容比较耗性能,就有必要在打印前做日志级别的预判。
分享到:
相关推荐
4. **参数构造**:根据接口文档,我们需要构建一系列参数,如`service`(服务名)、`partner`(商户ID)、`payment_type`(支付类型)、`batch_no`(批次号)、`batch_num`(付款条目数)、`out_trade_no`(订单号)...
总的来说,支付宝即时分润接口是实现多方资金结算的重要工具,商家需要理解并正确使用接口参数,遵循签名规则,以及妥善处理可能出现的错误,确保分润操作的顺利进行。在开发过程中,应仔细阅读官方文档,理解各项...
请求参数说明部分详细列出了每个参数的作用,例如`out_trade_no`代表商户订单号,`subject`表示订单标题,`total_amount`则指定了交易金额。 4.2 列表: 参数列表通常以表格形式展示,包括参数名、参数类型、是否...
#### 接口使用场景 - **电商领域**:适用于电商平台内部商家之间的结算。 - **服务外包**:适用于服务外包平台向服务商和平台运营者之间的收益分配。 - **多级分销体系**:适用于多级分销网络中的佣金分配。 #### ...
在本文中,我们将深入探讨ADO数据库接口及其源代码,以及如何在VC++环境中使用它们。 **ADO的核心概念** 1. **Connection对象**:这是与数据库建立连接的基础,它包含了数据库的连接字符串、登录凭据等信息。通过...
需要通过所有的测试案例,测试案例会有测试码,全部通过以后才可以使用正式接口地址 package fcm import ( "encoding/json" "io/ioutil" "net/http" "net/url" "testing" "time" ) func TestCheck ( t * ...
* postXmlSSLCurl(),使用证书,以post方式提交xml到对应的接口url */ include_once("SDKRuntimeException.php"); include_once("WxPay.pub.config.php"); /** * 所有接口的基类 */ class Common_util_pub { ...
- **\no_namespace**:指定不使用命名空间 ADODB{},使所有内容成为全局作用域。 - **\rename ("EOF", "adoEOF")**:为了避免与 C 语言标准库中的 `EOF` 宏冲突,将 ADO 中的 `EOF` 改名为 `adoEOF`。 #### 三、...
通过使用可变长的子网掩码可以让位于不同接口的同一网络编号的网络使用不同的掩码,这样可以节省IP地址,充分利用有效的IP地址空间。 如下图所示: Router1和Router2的E0端口均使用了C类地址192.1.0.0作为网络地址,...
在海思hi3536开发板上,需要在/etc/profile中设置环境变量QT_QPA_EVDEV_MOUSE_PARAMETERS='/dev/input/event0',以便QT可以捕获鼠标事件。 三、设备设置 在海思hi3536开发板上,需要设置设备以便QT可以正确地捕获...
这个库为开发者提供了易于使用的接口来处理 HTTP 服务,包括请求/响应操作、上传和下载任务、以及管理缓存。在 AFNetworking 2.5 版本中,它继续优化了性能并增加了对更多 HTTP 协议特性的支持。 ### 一、安装与...
在ActionInvocation的doIntercept方法中,拦截器首先获取当前的Action对象,然后判断它是否实现了NoParameters接口。如果实现了这个接口,那么说明Action不接受任何请求参数,否则就会继续处理参数。 ActionContext...
1. **_parameters** 字典:存储用户直接创建的`Parameter`对象,这些通常是网络的可学习权重。`Parameter`类是一个特殊的`Tensor`,它会在反向传播时自动计算梯度。 2. **_modules** 字典:包含了所有子`Module`...
在.NET开发环境中,ADO.NET是连接数据库的重要工具,它提供了丰富的接口和类库来与数据库进行交互,包括读取、写入数据等操作。当涉及到将图片存储到SQL Server数据库时,我们可以利用ADO.NET的对象和方法来实现。...
在VC++中使用ADO(ActiveX Data Objects)操作Access数据库是一种高效且易于上手的方法,尤其适合于不熟悉低层数据库接口如ODBC API、DAO、RDO的开发者。ADO建立在OLE DB之上,提供了简单易用的接口,同时保持了良好的...
首先,需要安装 3270 仿真软件 PCOM(最新 5.7 版),然后配置通信菜单,选择主机类型为 zSeries 或 OS390,接口为 LAN,连接方式为 Telnet3270,链路参数为 IP 地址 127.0.0.1,端口 3270。 2.登录 TSO 时的设置 ...
- **ODBC示例**: 展示如何使用LotusScript通过ODBC接口访问关系数据库的具体步骤。 #### 69. Managing JavaScript "popup" windows - **管理方法**: 使用JavaScript或LotusScript来控制弹出窗口的显示和关闭。 ###...
55. **关闭参数窗口**: 通过REPORT的PARAMETERS-FORM属性设置为NO。 56. **定长输出报表**: 通过调整列宽和行高,实现定长输出。 57. **FORMS 4.5的"宏"**: 宏是FORMS 4.5中的一个重要特性,用于简化代码和实现...
- 引入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_串口初始化" 涉及的是在基于S3C2410处理器的...这个过程涉及到底层硬件控制、操作系统驱动以及应用程序接口的使用。了解这些知识对于开发嵌入式系统的串口通信功能至关重要。