有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想加密用户输入并将其存储在数据库中。我使用的是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;
    }

}

我不知道我做错了什么

是否有一种最佳实践可用于加密用户输入


共 (2) 个答案

  1. # 1 楼答案

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

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

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

    最简单的方法(我是KISS范型的粉丝)是访问器/变异器方法:

    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. # 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)方法