Liferay 启动过程分析1-重定向到 http://host:port/c

简介:

前几天搞了一个BUG,吧精力耗尽,也激发了我对Liferay这个框架内部的探究欲望。所以这几天端午节准备对Liferay框架启动过程进行深入研究,来满足自己的好奇心。

 

当我们在地址栏中访问http://localhost:8080时,因为Liferay应用本质上也是一个web应用,所以它会去找ROOT应用的web.xml,因为定义了<welcome-file-list>:

 
 
  1. <welcome-file-list> 
  2.         <welcome-file>index.html</welcome-file> 
  3.         <welcome-file>index.jsp</welcome-file> 
  4.     </welcome-file-list> 

 

所以,它会去找index.jsp:

 
 
  1. ... 
  2. <
  3. ... 
  4. String redirect = null
  5.  
  6. LayoutSet layoutSet = (LayoutSet)request.getAttribute(WebKeys.VIRTUAL_HOST_LAYOUT_SET); 
  7.  
  8. if (layoutSet != null) { 
  9.     long defaultPlid = LayoutLocalServiceUtil.getDefaultPlid(layoutSet.getGroupId(), layoutSet.isPrivateLayout()); 
  10.  
  11.     if (defaultPlid != LayoutConstants.DEFAULT_PLID) { 
  12.         Layout layout = LayoutLocalServiceUtil.getLayout(defaultPlid); 
  13.  
  14.         ServicePreAction servicePreAction = (ServicePreAction)InstancePool.get(ServicePreAction.class.getName()); 
  15.  
  16.         ThemeDisplay themeDisplay = servicePreAction.initThemeDisplay(request, response); 
  17.  
  18.         redirect = PortalUtil.getLayoutURL(layout, themeDisplay); 
  19.     } 
  20.     else { 
  21.         redirect = PortalUtil.getPathMain(); 
  22.     } 
  23. else { 
  24.     redirect = PortalUtil.getHomeURL(request); 
  25.  
  26. if (!request.isRequestedSessionIdFromCookie()) { 
  27.     redirect = PortalUtil.getURLWithSessionId(redirect, session.getId()); 
  28.  
  29. response.setHeader(HttpHeaders.LOCATION, redirect); 
  30.  
  31. response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 
  32. %> 
  33.  
  34. <html> 
  35.  
  36. <head> 
  37.     <title></title> 
  38.     <meta content="1; url=<%= redirect %>" http-equiv="refresh" /> 
  39. </head> 
  40.  
  41. <body onload="javascript:location.replace('<%= redirect %>')"> 
  42.  
  43. </body> 
  44.  
  45. </html> 

 

其中,最值得看的就是<body onload="javascript:location.replace...),它会在DOM树加载完毕之后触发,那么我们感兴趣的是,这个<%=redirect%>到底是什么呢?

 

寻找<%=redirect%>的值

为此,我们去看上面那段代码,因为第一次登录,所以什么用户信息都没有,所以实际上走的是以下的代码段:

 
 
  1. else { 
  2.         redirect = PortalUtil.getPathMain(); 

 

然后这段代码会调用PortalUtil中的:

 
 
  1. public static String getPathMain() { 
  2.         return getPortal().getPathMain(); 
  3.     } 

 

然后调用PortalImpl类中的:

 
 
  1. public String getPathMain() { 
  2.     return _pathMain; 

而这个_pathMain是由该类中以下代码提供的,在PortalImpl构造器中:

 
 
  1. // Paths 
  2.  
  3. _pathProxy = PropsValues.PORTAL_PROXY_PATH; 
  4.  
  5. _pathContext = ContextPathUtil.getContextPath(PropsValues.PORTAL_CTX); 
  6. _pathContext = _pathProxy.concat(_pathContext); 
  7.  
  8. _pathFriendlyURLPrivateGroup = 
  9.     _pathContext + _PRIVATE_GROUP_SERVLET_MAPPING; 
  10. _pathFriendlyURLPrivateUser = 
  11.     _pathContext + _PRIVATE_USER_SERVLET_MAPPING; 
  12. _pathFriendlyURLPublic = _pathContext + _PUBLIC_GROUP_SERVLET_MAPPING; 
  13. _pathImage = _pathContext + PATH_IMAGE; 
  14. _pathMain = _pathContext + PATH_MAIN; 
  15.  
  16. // Groups 

所以_pathMain为_pathContext+PATH_MAIN ,我们依次来解析:

 

解析 _pathContext:

对于_pathContext,它是ContextPathUtil.getContextPath(PropsValues.PORTAL_CTX);

其中PropsValues.PORTAL_CTX是:

 
 
  1. public static final String PORTAL_CTX = PropsUtil.get(PropsKeys.PORTAL_CTX); 

 

它会去找PropsKeys接口中的常量定义:

 
 
  1. public static final String PORTAL_CTX = "portal.ctx"

 

然后找到并替换之后,去执行PropsUtil.get("portal.ctx");

 
 
  1. public static String get(String key) { 
  2.     return _instance._get(key); 

 

它会访问

 
 
  1. private String _get(String key) { 
  2.         return _getConfiguration().get(key); 
  3.     } 

这段代码最终会访问配置文件,然后读取key-value对到Configuration中,我们在portal.properties中找到了portal.ctx的定义:

 
 
  1. ## 
  2. ## Portal Context 
  3. ## 
  4.  
  5.     # 
  6.     # Specify the path of the portal servlet context. This is needed because 
  7.     # javax.servlet.ServletContext did not have access to the context path until 
  8.     # Java EE 5. 
  9.     # 
  10.     # Set this property if you deploy the portal to another path besides root. 
  11.     # 
  12.     portal.ctx=/ 

所以portal.ctx=/

 

解析PATH_MAIN:

它在Portal接口中有定义:

 
 
  1. public static final String PATH_MAIN = "/c"

 

所以综上所述,在PortalImpl构造器中的_pathMain = _pathContext + PATH_MAIN="/"+"/c"="//c"

它就是<%=redirect%>的值。

 

所以当index.jsp中DOM树加载完毕之后,它会去执行:

 
 
  1. <body onload="javascript:location.replace('//c')">  

 

而对于location.replace(String)方法,它的作用是启动一个不可逆的重定向:参见下面这篇文章:

http://www.roseindia.net/javascript/javascript-location-replace.shtml

所以我们现在知道,在DOM树加载完毕后,它吧请求发送到了http://localhost:8080/c 这个位置。

 

之后的步骤见下一篇博客

 





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/905695,如需转载请自行联系原作者

目录
相关文章
|
4月前
|
缓存 网络协议 数据库连接
C/S架构中HTTP错误状态码原因分析及解决办法
HTTP(Hypertext Transfer Protocol)是用于在客户端和服务器之间传输数据的协议。当在浏览器或其他HTTP客户端中访问网页时,可能会发生各种访问报错。我们需要根据网页提供的错误状态码分析错误原因,以找到相对应的解决办法。
49 0
|
4月前
|
移动开发 JSON 监控
网络协议解析:在员工上网监控软件中实现HTTP流量分析
随着企业对员工网络活动的监控需求不断增加,开发一套能够实现HTTP流量分析的网络协议解析系统变得愈发重要。本文将深入探讨如何在员工上网监控软件中实现HTTP流量分析,通过代码示例演示关键步骤。
226 0
|
3天前
|
网络协议 应用服务中间件 nginx
nginx 302 301 设置 url 转跳 nginx 资源重定向 nginx tcp 和 http 转发
nginx 代理后端网站,和 网站资源目录重定向到其他连接地址
39 3
|
1月前
|
编解码 索引
HTTP-FLV详解及分析(三)
HTTP-FLV详解及分析
29 0
|
1月前
|
内存技术
HTTP-FLV详解及分析(二)
HTTP-FLV详解及分析
27 0
|
1月前
|
移动开发 网络协议 应用服务中间件
HTTP-FLV详解及分析(一)
HTTP-FLV详解及分析
29 0
|
4月前
|
搜索推荐 应用服务中间件 Apache
HTTP状态码301(永久重定向)不同Web服务器的配置方法
当用户或搜索引擎向服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中包含状态码301,以向用户表示该资源已经永久改变了位置。
99 2
|
5月前
|
前端开发 JavaScript 应用服务中间件
个人博客网站如何实现https重定向(301)到http
对于个人网站站注册比较少的,服务器配置不是很好的,没必要https,https跳转到http是要时间的,会影响网站打开的速度。免费的https每年都要更换。
76 2
|
5月前
|
网络协议
Wireshark中的http协议包分析
Wireshark可以跟踪网络协议的通讯过程,本节通过http协议,在了解Wireshark使用的基础上,重温http协议的通讯过程。 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网的数据通信的基础。 下图是访问百度页面的头部文件的Wireshark数据包截取图,以下几点说明如下:
Wireshark中的http协议包分析
|
6月前
|
JavaScript
HTTP header location 重定向 URL
HTTP header location 重定向 URL