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):

在Tiles框架(tiles-defs.xml)中定义了这个forward key实际指向的页面:


        
        
    

所以最终的页面是/portal/terms_of_use.jsp



在这个页面中,我们可以看到对应的 "I Agree"和"I Disagree" 2个按钮的页面代码为:


        
            
            <%
            String taglibOnClick = "alert('" + UnicodeLanguageUtil.get(pageContext, "you-must-agree-with-the-terms-of-use-to-continue") + "');";
            %>
            
        
    

我们可以看到,当用户点击"I Disagree"时候,它会跳到一个alert对话框,然后阻止你进一步操作直到你点了agree按钮。当用户点击"I Agree"时候,它会做一个表单提交,提交的url如下:



    
    


提交到了/portal/update_terms_of_use,结合struts-config.xml,我们这个请求对应一个Struts的Action而不是一个页面:

我们跟进到这个类:

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:

关于Liferay中用户接受用户协议的研究_第1张图片


用户第一次注册然后登陆时选择接受"I Agree"用户term之后,它会显示改变这个字段的值:

从上面可以看出,我这里注册了一个用户,名字叫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没有被更新。