`
mxyzdl1234
  • 浏览: 3488 次
  • 性别: 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方法都是被执行的。那么以后对于打印日志的内容比较耗性能,就有必要在打印前做日志级别的预判。
分享到:
评论

相关推荐

    PHP微信支付WxPayPubHelper

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

    解析window.open的使用方法总结

    – window.open (‘page.html’,’newwindow’,’height=100,width=400,top=0,left=0,toolbar=no,menubar=no,scrollbars=no, resizable=no,location=no, status=no’) //写成一行 –&gt; [removed]其中yes/no也可使用1/...

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

    torch.nn 是专门为神经网络设计的模块化接口,nn构建于autgrad之上,可以用来定义和运行神经网络 nn.Module 是nn中重要的类,包含网络各层的定义,以及forward方法 查看源码 初始化部分: def __init__(self): ...

    CISCO 技术大集合

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

    ZendFramework中文文档

    2.3.2. 使用声明(Assert)来编写条件性的 ACL 规则 3. Zend_Auth 3.1. 简介 3.1.1. 适配器 3.1.2. 结果 3.1.3. 身份的持久(Persistence) 3.1.3.1. 在PHP Session 中的缺省持久(Persistence) 3.1.3.2. 实现...

    grub4dos-V0.4.6a-2017-02-04更新

    使用command --set-ext设置,每个扩展名使用";"分隔 例子: command --set-ext=.g4b;.g4e 执行时可以不用输入扩展名,比如输入test如果当前路径下有一个test.g4b就会自动使用。 2013-10-17 1.修改代码支持...

    cmd操作命令和linux命令大全收集

    netstat -s 查看正在使用的所有协议使用情况 nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名 tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:“-w数字”用于设置超时...

    [原创]自己工作中常用的模板库,简化你的工作

    这上传的资源中包含一套我工作中常用的模板库,及不需要MFC支持的excel操作接口,导出函数调用栈(dump stack)接口,可以直接用VS2008运行TestCodeLib.sln来根据unit test来了解用法。 ⑴ 需求(requirements) 重量级...

    HGE_系列教材(1-9)

    &lt;1&gt; 资源的打包(pack):HGE 使用ZIP 格式的资源包,你可以使用任何的打包工 具,甚至还可以给资源包加密 &lt;2&gt; 纹理(Texture)工具 &lt;3&gt; 粒子系统编辑器:能够设定粒子的速度,方向,生命周期,轨迹,颜色,透明等 ...

    Excel Report Builder

    Excel Report Builder Excel Report 万能报表平台 Excel 使用WEB服务(webservice)访问远程数据库 使用本软件可以使你的应用系统(数据库)和excel相连。 可以把它嵌入到你的应用系统里,做为应用系统的...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    Excel Report Builder4.45

    Excel Report Builder Excel Report 万能报表平台 Excel 使用WEB服务(webservice)访问远程数据库 使用本软件可以使你的应用系统(数据库)和excel相连。 可以把它嵌入到你的应用系统里,做为应用系统的...

    Excel Report 万能报表平台4.45

    Excel Report Builder Excel Report 万能报表平台 Excel 使用WEB服务(webservice)访问远程数据库 使用本软件可以使你的应用系统(数据库)和excel相连。 可以把它嵌入到你的应用系统里,做为应用系统的...

    freemarker总结

    其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替&gt;会有更好的效果,因为 FreeMarker会把&gt;解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:(x&gt;y)&gt; ...

    Hibernate注释大全收藏

    //no overriding here } @Embeddable public class Country implements Serializable { private String iso2; @Column(name="countryName") private String name; public String getIso2() { return iso2; } ...

    MopacPro 量子化学 计算软件

    6. 解析的Pariser-Parr, Nishimoto-Mataga, Nishimoto-Mataga-Weiss,Ohno,Ohno-Klopman和DasGupta-Huzinaga公式,用于求解双中心电子排斥积分。 7. 支持的坐标输入格式有Gaussian型Z矩阵和MOPAC内坐标。 8. 到...

    usb_parrot_r16_tinav2.0_20161024_1758.7z

    将V4L2_PIX_FMT_NV12修改成你们使用的usb camera所支持的采集格式。 比如支持MJPEG格式,改成为 hv-&gt;capture.cap_fmt = V4L2_PIX_FMT_MJPEG; 如果是YUYV格式 hv-&gt;capture.cap_fmt = V4L2_PIX_FMT_YUYV; 如果是H264...

    单片机主从控制系统的软硬件设计.doc

    RS485通信接口的信号传输是用两根线之间的电压表示逻辑 1和0的。因为发送端两根传送线,而且接受接收端也是两根传送线,这样RS485接受和发 送仅需要2根线就完成了传输。由于传输线采用了差动信道,所以它的干扰抑制性...

    开发PHP扩展详细教程

    客户想给系统集成ICBC的接口,但是用ICBC的接口需要用他们的提供的库函数去 1. sign对发送的数据进行签名 2. getcertid获取用户证书的版本 3. verifySign对签名后的数据进行验证 问题是ICBC只给了现成的COM...

Global site tag (gtag.js) - Google Analytics