【问题标题】:String to String Type Conversion in Struts 2 not working?Struts 2 中的字符串到字符串类型转换不起作用?
【发布时间】:2016-08-04 00:13:59
【问题描述】:

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

  • StringInteger
  • StringLong
  • Stringbyte[]

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

@Override
public Object convertFromString(Map context, String[] value, Class arg2) {
    String val = value[0];      

    try {
        return ASEEncDecUtil.encrypt(val.getBytes("UTF-8"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return null;
    }

}

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

是否存在应该用于加密用户输入的最佳实践?

【问题讨论】:

  • 用户输入是指密码内容(例如文本)?
  • 文本内容包含一些我们想要加密的敏感信息。

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


【解决方案1】:

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

不是以某种格式获取对象、对其执行业务然后以相同格式返回它的正确工具。

也就是说,对于这种事情,您可以使用多种机制(正交的,如 Struts2 拦截器和 Java EE 装饰器,或特定的如操作方法甚至 Mutators / 访问器),根据次数等因素,每一种更合适/ 您需要使用它们的地方。

最简单的方式(我是 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;
    }

}

【讨论】:

    【解决方案2】:

    您很可能在自定义转换器中扩展 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) 方法。

    【讨论】:

    • 感谢您解释为什么没有调用 convertFromString() 方法。
    猜你喜欢
    • 2014-11-20
    • 2012-02-15
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2011-01-20
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多