在Netbeans中使用带有WS-Security的METRO 2.3我尝试读取加密的Web服务的错误消息。
通信正常,直到我的有效负载包含错误。然后,服务器发送一条加密的错误消息,其中包含出错的信息。我的客户端尝试解密它并理解消息得到的结构超出预期,并抛出XMLSignatureException:
javax.xml.crypto.dsig.XMLSignatureException:
WSS1717: Error occurred while doing digest verification of body/payload
隐藏服务器发送的错误消息。
第146行引用了异常:
如果我启用了最好的日志记录级别,我可以读取第141行记录的信息。
当我捕获异常时,是否可以读取xml流的canonicalizedData?
答案 0 :(得分:1)
由于似乎没有简单的方法可以做到这一点,我写了一个解决方法。
如果我在最好的级别上启用“记录”,则会报告太多详细信息。所以我编写了自己的日志消息过滤器。
Logger wsitlogger = Logger.getLogger("com.sun.xml.wss.logging.impl.opt.signature");
wsitlogger.setLevel(Level.FINEST);
TextAndLevelFilter logFilter= new TextAndLevelFilter(Level.INFO);
logFilter.addPrefix("WSS1764");
wsitlogger.setFilter(logFilter);
和我的TextLevelFilter.java:
public class TextAndLevelFilter implements Filter {
private static final int offValue = Level.OFF.intValue();
private final int levelValue;
private final Collection<String> prefixes = new LinkedList<>();
public TextAndLevelFilter(Level level) {
this.levelValue = level.intValue();
}
public void addPrefix(String prefix) {
prefixes.add(prefix);
}
@Override
public boolean isLoggable(LogRecord record) {
final String message = record.getMessage();
for (String prefix : prefixes) {
if (message.startsWith(prefix)) {
return true;
}
}
return record.getLevel().intValue() >= levelValue && levelValue != offValue;
}
}