代码之家  ›  专栏  ›  技术社区  ›  dpilwal

Struts 2中的字符串到字符串类型转换无效?

  •  3
  • dpilwal  · 技术社区  · 8 年前

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

    • 一串 Integer
    • 一串 Long
    • 一串 byte[]

    但当我尝试转换为目标类型时: 一串 ,它不工作 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;
        }
    
    }
    

    我不知道我做错了什么。

    是否有一个最佳实践应该用于加密用户输入?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Aleksandr M    8 年前

    您很可能正在扩展 StrutsTypeConverter 类。在其中 convertFromString convertToString 方法从 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);
        }
    }
    

    所以如果 toClass String 然后上课 从字符串转换 从未调用。

    为了实现你想要的,扩展 com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter 而不是覆盖 public Object convertValue(Map context, Object o, Class toClass) 方法

        2
  •  2
  •   Andrea Ligios    8 年前

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

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

    这就是说,对于这类事情,你可以使用几种机制(正交的,比如Struts2拦截器和JavaEE装饰器,或者特定的,比如Action Methods,甚至是Mutators/Accessor),每一种机制都根据你需要使用它们的次数/地点等因素更加合适。

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