字符串到字符串类型转换Struts 2不起作用?

时间:2016-04-13 05:23:14

标签: java design-patterns encryption struts2 type-conversion

我想加密用户输入并将其存储在数据库中。我正在使用Struts 2类型转换,所有用户输入都被视为Int(floor(viewSize / itemSize)),并且以下转换正常工作:

  • StringString
  • IntegerString
  • LongString

但是当我尝试转换为目标类型:byte[]时,它不起作用,并且不会调用String方法。

convertFromString()

我无法弄清楚我做错了什么。

是否有应该用于加密用户输入的最佳做法?

2 个答案:

答案 0 :(得分:4)

您最有可能在自定义转换器中扩展StrutsTypeConverter类。其中convertFromStringconvertToString方法是从convertValue方法调用的,它看起来像这样:

public Object convertValue(Map context, Object o, Class toClass) {
    if (toClass.equals(String.class)) {
        return convertToString(context, o);
    } else if (o instanceof String[]) {
        return convertFromString(context, (String[]) o, toClass);
    } else if (o instanceof String) {
        return convertFromString(context, new String[]{(String) o}, toClass);
    } else {
        return performFallbackConversion(context, o, toClass);
    }
}

因此,如果toClassString类,则永远不会调用convertFromString

要实现您的目标,请改为展开com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter并覆盖public Object convertValue(Map context, Object o, Class toClass)方法。

答案 1 :(得分:2)

转换器的工作是执行不同格式之间的转换。

是获取格式对象,在其上执行业务然后以相同格式返回对象的正确工具。

那就是说,对于这种事情,你可以使用几种机制(像Struts2拦截器和Java EE装饰器这样的正交,或者像Action Methods或者甚至是Mutators / Accessors这样的特定机制),每一个都根据像次数这样的因素更合适/你需要使用它们的地方。

最简单的方法(我是KISS范式粉丝)是Accessors / Mutators方式:

public class KeepItSimpleStupidAction extends ActionSupport {

    @Inject Logger LOG;

    private String text; // text is always encrypted inside the action

    public String getText() { // but it can also be read decrypted by calling the getter 
        return ASEEncDecUtil.decrypt(text.getBytes("UTF-8"));
    }

    public void setText(String text) { // the setter automatically encrypts it
        this.text = ASEEncDecUtil.encrypt(text.getBytes("UTF-8"));
    }

    public String execute() {
        LOG.debug("text decrypted: " + getText());
        LOG.debug("text encrypted: " + text);
        return SUCCESS;
    }

}