OSChina 是用 Java 开发的,以前用 Java 开发的 Web 项目,URL 一般都是 xxx.jsp 或者是 xxx.do 之类的,后者是因为用了 Struts 框架的缘故。后来形如 /xxxx/xxxx 这样的 RESTful 风格 URL 很流行。而 OSChina 也是采用 RESTful 风格的这种 URL,看起来比较专业,呵呵。
在 Java 里要进行自定义 URL 的处理,一般用 Servlet 或者 Filter 来处理,而 Servlet 主要用于处理有固定前缀和后缀的 URL 地址,例如 /action/xxxx 和 xxxx.do 之类的请求。但一般 Servlet 不适合处理 /* 这样的请求,因为系统中总会有某些 URL 是需要特殊处理,例如静态文件就不希望走相同的逻辑,因为它没有“链”的结构,接收了请求就必须处理,不能再返回其他 Servlet 。而 Filter 则不同,它是一种责任链的设计模式,可以将请求传递到链中的下一个处理者。
关于 Servlet 和 Filter 还可阅读我之前的一片文章:初学 Java Web 开发,请远离各种框架,从 Servlet 开发
因为二者的不同,OSChina 采用的是 Filter 实现自定义 URL 处理。
先来看 OSChina 的 URL,例如:
http://www.oschina.net/project/tag/355/html5
URL 一般包含这么几部分内容:
部分 | 对应 HttpServletRequest 方法 | 示例中的取值 |
schema | getSchema() | http |
hostname | getServerName() | www.oschina.net |
port | getServerPort() | 80 |
path | getRequestURI() | /project/tag/355/html5 |
在这里我们只关心 hostname 和 path 这两部分。
[hostname]
OSChina 上跟应用有关的有多个二级域名,分别是 www.oschina.net、my.oschina.net、m.oschina.net 和 wap.oschina.net 。这几个 hostname 对应了不同的模版路径。这些对应的路径在 web.xml 的 Filter 配置里:
<filter> <filter-name>global</filter-name> <filter-class>net.oschina.OSChinaFilter</filter-class> <init-param> <param-name>domain</param-name> <param-value>oschina.net</param-value> </init-param> <init-param> <param-name>template-path-prefix</param-name> <param-value>/WEB-INF</param-value> </init-param> <init-param> <param-name>ignore</param-name> <param-value>/action/,/uploads/,/img/,/css/,/js/,/test/</param-value> </init-param> <init-param> <param-name>ignoreExts</param-name> <param-value>ico,jpg,gif,png,bmp,doc,xls,pdf,zip,rar</param-value> </init-param> <init-param> <param-name>default</param-name> <param-value>/www</param-value> </init-param> <init-param> <param-name>m</param-name> <param-value>/templates/mobile</param-value> </init-param> <init-param> <param-name>wap</param-name> <param-value>/wap</param-value> </init-param> <init-param> <param-name>my</param-name> <param-value>/templates/home</param-value> </init-param> </filter>在这里,每个二级域名都对应了一个模版目录,其中 default 是表示其他没有配置的主机则使用该模版目录。有了这个东西,当需要开发一种新的客户端界面的时候,就不会跟原有的页面冲突,而且 URI 还可以保持一致,如:
安卓客户端看blog ,代码都是没有规律的排序的 O(∩_∩)O######回复 @红薯 : 吼吼,要不改成.exe以前这么玩的。######请问这个跟本文有何关系?######简单易懂。######支持OSC自爆######学习 学习!######学习了######支持,可惜偶不搞java######我觉得如果要像这样生成二次请求,那第一次请求的时候参数应该不要明确显示出来,至少不要那么容易辨别,而且第一次请求也太长.可以对第一次请求进行加密,也只有一级.如这样: http://www.oschina.net/d6e3n8d0g9a0######回复 @红薯 : 他的意思是说把path给进行编码了吧######不明白你的意思哦######很清晰!###### 不懂JAVA######mark
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。