Liferay中使用者接受使用者協議的代碼在PortalRequestProcessor類中,具體代碼是:
// Authenticated users should agree to Terms of Use if ((user != null) && !user.isAgreedToTermsOfUse()) { boolean termsOfUseRequired = false; try { termsOfUseRequired = PrefsPropsUtil.getBoolean( user.getCompanyId(), PropsKeys.TERMS_OF_USE_REQUIRED); } catch (SystemException se) { termsOfUseRequired = PropsValues.TERMS_OF_USE_REQUIRED; } if (termsOfUseRequired) { return _PATH_PORTAL_TERMS_OF_USE; } }
這裡可以看出,是否跳轉到/portal/terms_of_use頁面是由布爾變數termsOfUseRequired來決定的,只有這個布爾變數為true時候才會發生跳轉。具體邏輯是:
(1)如果使用者不為null,也就是非第一次登陸Liferay,並且使用者的agreedToTermOfUse為false, 也就是第一次登陸時候。
那麼就先初始化這個布爾變數為false ,然後讀取portal.properties中的TERMS_OF_USE_REQUIRED變數,這個變數的初始值為true.'
# # Set this to true if all users are required to agree to the terms of use. # terms.of.use.required=true #
那麼跳轉到/portal/terms_of_use又如何呢?
我們發現,定義了一個struts的action_mapping(在struts-config.xml):
<action path="/portal/terms_of_use" forward="portal.terms_of_use" />
在Tiles架構(tiles-defs.xml)中定義了這個forward key實際指向的頁面:
<definition name="portal.terms_of_use" extends="portal"> <put name="title" value="terms-of-use" /> <put name="content" value="/portal/terms_of_use.jsp" /> </definition>
所以最終的頁面是/portal/terms_of_use.jsp
在這個頁面中,我們可以看到對應的 "I Agree"和"I Disagree" 2個按鈕的頁面代碼為:
<c:if test="<%= !user.isAgreedToTermsOfUse() %>"> <aui:button-row> <aui:button type="submit" value="i-agree" /> <% String taglibOnClick = "alert('" + UnicodeLanguageUtil.get(pageContext, "you-must-agree-with-the-terms-of-use-to-continue") + "');"; %> <aui:button onClick="<%= taglibOnClick %>" type="cancel" value="i-disagree" /> </aui:button-row> </c:if>
我們可以看到,當使用者點擊"I Disagree"時候,它會跳到一個alert對話方塊,然後阻止你進一步操作直到你點了agree按鈕。當使用者點擊"I Agree"時候,它會做一個表單提交,提交的url如下:
<aui:form action='<%= themeDisplay.getPathMain() + "/portal/update_terms_of_use" %>' name="fm"> <aui:input name="doAsUserId" type="hidden" value="<%= themeDisplay.getDoAsUserId() %>" /> <aui:input name="<%= WebKeys.REFERER %>" type="hidden" value="<%= referer %>" />
提交到了/portal/update_terms_of_use,結合struts-config.xml,我們這個請求對應一個Struts的Action而不是一個頁面:
<action path="/portal/update_terms_of_use" type="com.liferay.portal.action.UpdateTermsOfUseAction" />
我們跟進到這個類:
public class UpdateTermsOfUseAction extends Action { @Override public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { long userId = PortalUtil.getUserId(request); UserServiceUtil.updateAgreedToTermsOfUse(userId, true); return mapping.findForward(ActionConstants.COMMON_REFERER); }}
可以發現,它會讓userServiceUtil來對目前使用者更新下agreedToTermsOfUse狀態位:
一直跟進會發現它最終調用的是UserLocalServiceImpl的updateAgreedToTermOfUse()方法:
public User updateAgreedToTermsOfUse( long userId, boolean agreedToTermsOfUse) throws PortalException, SystemException { User user = userPersistence.findByPrimaryKey(userId); user.setAgreedToTermsOfUse(agreedToTermsOfUse); userPersistence.update(user, false); return user; }
它會去設定User_表的欄位:
見User_表的DDL:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/1130101230-0.png" title="109.PNG" />
使用者第一次註冊然後登陸時選擇接受"I Agree"使用者term之後,它會顯示改變這個欄位的值:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131228/113010F60-1.png" title="110.png" />
從上面可以看出,我這裡註冊了一個使用者,名字叫kevin qian,那麼在初次接受term之後,會自動吧資料庫表中agreedToTermsOfUse這個欄位的位設定為1,因此下次就會跳過使用者條款頁面了。
總結:
綜上所述我們有以下事實:
(1)當使用者資訊剛插入到Users_表中時候,agreedToTermsOfUse為false, 這也是使用者的初始狀態。
(2)如果使用者在accept 使用者條款頁面中點了"Agree",那麼資料庫中agreedToTermsOfUse這個欄位就會變成1了
(3)如果使用者剛註冊好他自己的賬戶(初始狀態),這時候user不為null,並且agreedToTermsOfUse為false,這時候,Liferay的struts action會吧使用者帶到使用者條款頁面,也就是/portal/terms_of_use.jsp頁面
(4)如果使用者曾經在這個使用者條款頁面選擇過 “ I Agree”,那麼後果就是它對應的資料庫記錄中的agreedToTermsOfUse欄位為true了,那麼它再不可能到使用者條款頁面了,
(5)如果一使用者不是新使用者,那麼他卻在登入後跳轉到使用者條款頁面,那麼唯一的解釋就是,這個使用者不是在這個資料庫中建立的,這個使用者的這個欄位agreedToTermsOfUse沒有被更新。
本文出自 “平行線的凝聚” 部落格,請務必保留此出處http://supercharles888.blog.51cto.com/609344/1271289