我必须解析Java中的一堆XML文件,有时 - 并且无效地 - 包含HTML实体,例如—,>等等.我理解处理这个问题的正确方法是在解析之前向XML文件添加合适的实体声明.但是,我无法做到这一点,因为我无法控制这些XML文件.
是否存在我可以覆盖的某种回调,只要Java XML解析器遇到这样的实体就会调用它?我无法在API中找到一个.
我想用:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = dbf.newDocumentBuilder();
Document doc = parser.parse( stream );
Run Code Online (Sandbox Code Playgroud)
我发现我可以重写resolveEntity的org.xml.sax.helpers.DefaultHandler,但我要如何使用这与更高级别的API?
这是一个完整的例子:
public class Main {
public static void main( String [] args ) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = dbf.newDocumentBuilder();
Document doc = parser.parse( new FileInputStream( "test.xml" ));
}
Run Code Online (Sandbox Code Playgroud)
}
使用test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar>Some text — invalid!</bar>
</foo>
Run Code Online (Sandbox Code Playgroud)
生产:
[Fatal Error] :3:20: The entity …Run Code Online (Sandbox Code Playgroud) 为什么代码替代(1)编译时没有警告,代码替代(2)产生"未经检查的强制转换"警告?
两者共同:
class Foo<T> {
Foo( T [] arg ) {
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案(1):
class Bar<T> extends Foo<T> {
protected static final Object [] EMPTY_ARRAY = {};
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案(2):
class Bar<T> extends Foo<T> {
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
protected static final Object [] EMPTY_ARRAY = {};
}
Run Code Online (Sandbox Code Playgroud)
备选方案(2)产生:
javac -Xlint:unchecked Foo.java Bar.java
Bar.java:4: warning: [unchecked] unchecked cast
super( (T []) EMPTY_ARRAY );
^
required: T[]
found: …Run Code Online (Sandbox Code Playgroud) 我有一个Apache Web服务器,它运行几个具有不同证书和SNI的TLS虚拟主机.
我可以使用curl访问各种虚拟主机(假设SNI使其工作).我也可以使用一个基本上只是在URL上的openConnection()的命令行Java程序来访问它们.
在我的Tomcat应用程序中,基本相同的客户端代码访问与客户端相同的Apache服务器,但始终以默认证书(defaulthost.defaultdomain)结束,而不是在URL中指定的虚拟主机的证书尝试访问.(这会产生SunCertPathBuilderException - 基本上它无法验证证书的证书路径,当然这是真的,因为它是非官方证书.但是,无论如何都不应该使用默认证书.)
就像我的应用程序/ Tomcat中的SNI已在客户端停用一样.我不知道为什么我的应用程序和命令行之间应该有不同的行为; 相同的JDK,相同的主机等
我找到了属性jsse.enableSNIExtension,但我确认两种情况都设置为true.问题:
任何想法,甚至是狂野的想法,为什么这两个程序的行为不同?
有什么想法我会如何调试这个?
这是Arch Linux on 86_64,JDK 8u77,Tomcat 8.0.32.
解决了.见底部.
刚刚升级到OSX Lion并试图让我的Perl安装再次运行:
sudo /usr/bin/perl -MCPAN -e 'install "MODULENAME"'
MODULENAME我试过的任何价值(例如JSON)产生:
...
Checking if your kit is complete...
Looks good
Writing Makefile for JSON
make: *** No rule to make target `/System/Library/Perl/5.12/darwin-thread-multi-2level/CORE/config.h', needed by `Makefile'. Stop.
MAKAMAKA/JSON-2.53.tar.gz
/Developer/usr/bin/make -- NOT OK
Run Code Online (Sandbox Code Playgroud)
我找不到任何类似的东西config.h,目录虽然存在...
甚至没有这个工作:
/usr/bin/cpan CPAN
Run Code Online (Sandbox Code Playgroud)
已解决:从AppStore下载并安装最新版本的XCode.请注意,只是从AppStore下载XCode不会安装它(为什么,Apple,为什么?)但是只将安装程序转储到/ Applications中.运行安装程序,这将解决此问题.
在即将发布的Java 9中,有没有办法动态发现哪些模块可用?
例如:
我不能从文档中说出来.
我在 Hugo 中有一个包含一堆静态页面和一个博客的网站。
在首页上,我想创建指向最近三篇博客文章的短链接(但不是任何可能最近修改的静态页面)。博客文章都在目录中blog/。
我无法弄清楚这个的语法。到目前为止,我有:
{{- range (.Paginate ( first 3 .Pages.ByDate )).Pages }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{- end}}
Run Code Online (Sandbox Code Playgroud)
但我还需要按目录过滤blog/。这是我的layouts/index.html模板中的。
example1.com和example2.com解析为host0.host0运行带有两个VirtualHost的Apache反向代理.它将example1.com的请求委托给host1,将example2.com的请求委托给host2.
在所有地方使用http,显然可以使用.
使用https,我可以将example1.com和example2.com的密钥粘贴在host0上,然后让host0与host1和host2对话http或https.鉴于SNI,这也应该有效.
我的问题:如果没有host0.com上的example1.com或example2.com密钥,它可以工作吗?我想避免host0能够执行中间人攻击.
如果我正确理解SNI,则仅在客户端将所需的虚拟主机传送到host0之后才交换密钥材料.这应该是(?)足够的信息,以便Apache基本上转发到host1或host2的连接,而根本不查看传输的内容.这根本不需要关键材料.
我是 postgres 新手,我正在尝试找出在运行 Web 应用程序时如何最好地保护我的数据库。
在 MySQL 中,我倾向于使用管理用户来执行诸如创建数据库、创建表、修改架构、删除表等操作:用于某些应用程序持续使用数据库时不应该发生的所有活动。然后,我有第二个用户(每个应用程序一个),该用户(仅)拥有应用程序所需的权限,例如插入、更新等。这可以避免应用程序错误/黑客造成灾难性后果。
现在我想弄清楚如何在 postgres 中做类似的事情。与 MySQL 不同,postgres 数据库似乎有一个“所有者”。如果我使用上面的方案,管理用户是否应该“拥有”所有应用程序的所有数据库?或者这里有哪些最佳实践?
另外:我只是发现授予“所有表”权限似乎意味着“当前定义的所有表”并且不包括将来的表。与 MySQL 不同,“on foo.*”表示所有当前和未来的表。那是对的吗?有没有办法在授予语句中包含未来的表,或者我每次都重新执行?
FUSE = 用户空间中的文件系统建议发行版同时打包一个 fuse2 和一个 fuse3(请参阅此处),并且确实如此。
这究竟是什么原因?是不是fuse3中的init代码不一样?
如果我将 USB 串行适配器插入 Mac,/dev 中会显示一个新设备,例如 /dev/tty.usbmodem1421 或 /dev/tty.usbserial-A7048O1O。
如果这是 Linux,我会寻找一个 udev 规则来解释设备名称的来源以及创建它的原因。
但这是OSX。Mac 上的设备名称是如何分配的(例如,为什么设备名称中有那些有趣的数字),以及哪一段代码是这样做的?