關於Liferay中使用者接受使用者協議的研究

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.