您的位置:首页 > Web前端

关于Liferay中用户接受用户协议的研究 推荐

2013-08-12 16:41 507 查看
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:




用户第一次注册然后登陆时选择接受"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没有被更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  用户条款 termOfUse