ok,最近在做openfire的项目,项目要求模仿userservice做一个管理用户和代理发送信息的插件,然后我就直接改userservice的代码了。。。结构和配置如下:
web-custom.xml配置如下
<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- Servlets -->
<servlet>
<servlet-name>userServiceServlet</servlet-name>
<servlet-class>com.kingray.plugin.servlet.UserServiceServlet</servlet-class>
</servlet>
<!--
-->
<servlet>
<servlet-name>messageServiceServlet</servlet-name>
<servlet-class>com.kingray.plugin.servlet.MessageServiceServlet</servlet-class>
</servlet>
<!-- Servlet mappings -->
<servlet-mapping>
<servlet-name>userServiceServlet</servlet-name>
<url-pattern>/userService</url-pattern>
</servlet-mapping>
<!--
-->
<servlet-mapping>
<servlet-name>messageServiceServlet</servlet-name>
<url-pattern>/messageService</url-pattern>
</servlet-mapping>
</web-app>
可是我使用 http://127.0.0.1:9090/plugins/kingrayplugin/messageService来访问却提示我无响应!我直接无语了啊,明明是按照官方的插件改的为何会错呢!好吧,我只能一个一个文件的比对了,可是,各种情况都试过了啊!
在网上找了各种方法,都不适用,最后没办法了,只能通过调试openfire来找原因了。
在openfire的src/web/WEB-INF/web.xml文件内找到该类,看字面就知道是插件servlet的处理
好吧,跟进去看看,PluginServlet.java中找到一个service方法,应该就是这个方法来处理servlet类型的,打印试试~
然后第二个if写着判断servlet请求,我们再跟进去看看
然后再编译openfire并测试,再看看输出~
仔细看看2038~2040行,明显可以看到keyset中是按照custom-web.xml中的配置添加的(区分大小写),可是我们访问的路径都被转换成了小写!!没想到openfire的开发人员竟然这么不细心啊~ok,解决方案就出来了:
1. 通过修改registerServlets方法中的 servlets.put(pluginName + url, (GenericServlet)instance); 修改为 servlets.put((pluginName + url).toLowerCase(), (GenericServlet)instance);
2. 给自己插件的custom-web.xml的每个servlet路径都转换为小写