因为我自己习惯研究一个应用从web.xml做为起点,我相信这是个不错的起点。
因此我将从jforum的第一个filter开始研究jforum,要是有更好的建议欢迎告诉我哟。万分感谢提出各种意见。
net.jforum.util.legacy.clickstream.ClickstreamFilter.java
这是jforum这个论坛在web.xml里面配置的唯一的一个filter,他的作用是用来判断前来访问的请求是否是一个机器人,比如说各种搜索引擎的bot,具体的判断是用BotChecker.java这个类的isBot方法来判断的
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException
{
// Ensure that filter is only applied once per request.
if (request.getAttribute(FILTER_APPLIED) == null) {
request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
String bot = BotChecker.isBot((HttpServletRequest)request);
if (bot != null && log.isDebugEnabled()) {
log.debug("Found a bot: " + bot);
}
request.setAttribute(ConfigKeys.IS_BOT, Boolean.valueOf(bot != null));
}
// Pass the request on
chain.doFilter(request, response);
}
net.jforum.util.legacy.clickstream.BotChecker.java
这是ClickstreamFilter中所使用到的一个工具类,它会获取clickstream-jforum.xml中所有配置的bot名称,通过与request.getHeader("User-Agent"),请求头中的User-Agent的名称进行比较返回出具体的bot类型。
net.jforum.util.legacy.clickstream.config.ConfigLoader.java
这是一个用来获取xml中内容的类,BotChecker.java中使用到的clickstream-jforum.xml就是通过它来解析的。ConfigLoader.java的解析方式是通过SAX的方式解析的
private ClickstreamConfig config;
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(fileInput, new ConfigHandler());
private class ConfigHandler extends DefaultHandler
{
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
if (qName.equals("bot-host")) {
config.addBotHost(attributes.getValue("name"));
}
else if (qName.equals("bot-agent")) {
config.addBotAgent(attributes.getValue("name"));
}
}
}
(以上的代码经过我修改,并不是源码,只是为了方便看,方便理解)
net.jforum.util.legacy.clickstream.config.ClickstreamConfig.java
这只是个值对象,其中用了两个List用来保存clickstream-jforum.xml中的bot的Host和Agent
在学习了这个Filter后学习到了用SAX的方式在java中解析xml的简单方法。
在每个请求都会在头信息当中都会标注User-Agent,通过IE提交的请求会有IE的User-Agent,FF会有FF的User-Agent,google的机器人在抓取网页信息时提交的请求也会包含它的User-Agent。通过判断它的值可以知道访问者是人还是蜘蛛,还可以知道访问者的浏览器类型。