2016-04-13 48 views
3

我想加密用户输入并将其存储在数据库中。我使用的Struts 2型转换,所有用户输入被当作String和转化如以下工作正常:字符串到字符串类型转换在Struts 2中不起作用?

  • 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; 
    } 

} 

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

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

+0

*用户输入*您的意思是一个*密码*或一个*内容*(例如一个文本)? –

+0

这是文本内容有一些我们想要加密的敏感信息。 – dpilwal

回答

2

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

它是而不是正确的工具获取格式对象,执行一个业务,然后以相同的格式返回它。这就是说,对于这种类型的东西,你可以使用多种机制(像Struts2拦截器和Java EE装饰器的正交,或者特定的动作方法,甚至是Mutators/Accessors),每一种机制都可以根据像时间/地点,你需要使用它们。

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

} 
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)方法。

+2

感谢您解释为什么方法convertFromString()没有被调用。 – dpilwal