1、ThemeDisplay是什么意思?
在Portlet中request分为两种renderRequet和actionRequest而portlet需要取得实例Id的时候都在renderRequest的时候才可以取到,如下例子
PortletPreferences preferences = renderRequest.getPreferences(); String portletResource = ParamUtil.getString(request, "portletResource"); if (Validator.isNotNull(portletResource)) { preferences = PortletPreferencesFactoryUtil.getPortletSetup(request, portletResource); } 其中portletResource是portlet的id 然后通过PortletPreferencesFactoryUtil工具类可以取得相应的portlet配置信息。
而在actionRequest是取不到的portlet实例的id的,actionRequest只是把当前页面所有东西传进来而已,中间经过portletAcition做了处理,如果在portletAction中做取portletId是不可取的,但是在Liferay中已经提供了这样的方法可以让我们在actionRequest中取得portlet的实例Id代码如下
ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest .getAttribute(WebKeys.THEME_DISPLAY); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); System.out.println("portletDisplay---->"+portletDisplay.getInstanceId()); System.out.println("portletDisplay getId---->"+portletDisplay.getId()); System.out.println("portletDisplay getPortletName---->"+portletDisplay.getPortletName());
这样就可以取到我们需要的对应的portlet实例id了
其中WebKeys.THEME_DISPLAY是Liferay中里面的接口常量 对应的名字是 THEME_DISPLAY
2、
PermissionChecker 是什么意思?
- com.liferay.portal.kernel.portlet.LiferayPortlet.StrutsPortlet中获取方式:
- PermissionChecker permissionChecker =
- PermissionThreadLocal.getPermissionChecker();
- com.liferay.portlet.journal.service.permission.JournalArticlePermission
- 页面中:
- JournalArticlePermission.contains(permissionChecker, article, ActionKeys.UPDATE)
- 页面中直接拿permissionChecker对象是通过com.liferay.taglib.theme.DefineObjectsTei定义的:
- new VariableInfo(
- "permissionChecker", PermissionChecker.class.getName(), true,
- VariableInfo.AT_END),
- JournalArticlePermission:>>>>>
- publicstaticboolean contains(
- PermissionChecker permissionChecker, JournalArticle article,
- String actionId) {
- if (permissionChecker.hasOwnerPermission(
- article.getCompanyId(), JournalArticle.class.getName(),
- article.getResourcePrimKey(), article.getUserId(), actionId)) {
- returntrue;
- }
- return permissionChecker.hasPermission(
- article.getGroupId(), JournalArticle.class.getName(),
- article.getResourcePrimKey(), actionId);
- }
- //通过ThemeDisplay也可以拿permissionChecker
- ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
- WebKeys.THEME_DISPLAY);
- PermissionChecker permissionChecker =
- themeDisplay.getPermissionChecker();
- //==================================================
- //通过PermissionThreadLocal也可以拿permissionChecker
- PermissionChecker permissionChecker =
- PermissionThreadLocal.getPermissionChecker();
- 为什么?
- 因为>>:PermissionCheckerUtil
- publicstaticvoid setThreadValues(User user) {
- long userId = user.getUserId();
- String name = String.valueOf(userId);
- PrincipalThreadLocal.setName(name);
- try {
- PermissionChecker permissionChecker =
- PermissionThreadLocal.getPermissionChecker();
- if (permissionChecker == null) {
- permissionChecker = (PermissionChecker)Class.forName(
- PropsValues.PERMISSIONS_CHECKER).newInstance();
- /**
- PropsValues.PERMISSIONS_CHECKER
- PropsValues>>>
- public static final String PERMISSIONS_CHECKER =
- PropsUtil.get(PropsKeys.PERMISSIONS_CHECKER); //就是PropsUtil.get("permissions.checker");
- portal.properties>>>>:
- permissions.checker=com.liferay.portal.security.permission.AdvancedPermissionChecker
- */
- }
- permissionChecker.init(user, _CHECK_GUEST);
- PermissionThreadLocal.setPermissionChecker(permissionChecker);
- }
- catch (Exception e) {
- _log.error(e);
- 什么时候在哪里会调用PermissionCheckerUtil.setThreadValues(user);呢?
- 两个地方:
- 1)MessageListenerImpl类的方法deliver中: PermissionCheckerUtil.setThreadValues(user);
- 2)MailingListMessageListener类的方法processMessage中:PermissionCheckerUtil.setThreadValues(user);
- 继续问,什么时候操作MessageListener?
- 在MainServlet的init方法中:
- try {
- Iterator<Portlet> itr = portlets.iterator();
- while (itr.hasNext()) {
- Portlet portlet = itr.next();
- MessageListener popMessageListener =
- portlet.getPopMessageListenerInstance();
- if (!portlet.isActive() || (popMessageListener == null)) {
- continue;
- }
- POPServerUtil.addListener(popMessageListener);
- /*上面这个方法会调用
- _instance._addListener(listener);
- 而_instance:private static POPServerUtil _instance = new POPServerUtil();
- */
- }
- }
- catch (Exception e) {
- _log.error(e, e);
- }
- //============================权限验证方式二=========================================
- PermissionLocalServiceImpl:
- boolean hasUserPermission(long userId, String actionId, long resourceId)
- resourceId是什么东西?
- //=========================权限验证方式三===========================================
- PortletPermissionUtil:
- publicstaticboolean contains(PermissionChecker permissionChecker, long plid, String portletId,String actionId)
- throws PortalException, SystemException{}
- 怎么获取plid和portletId? (分别数据库表PORTLETPREFERENCES 的字段PLID和PORTLETID)====>>>>>>>
- ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY);
- long plId=themeDisplay.getPlid();
- String portletId=themeDisplay.getPortletDisplay().getId();
- 实战代码:
- PermissionChecker permissionChecker=PermissionThreadLocal.getPermissionChecker();
- ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY);
- long plId=themeDisplay.getPlid();
- String portletId=themeDisplay.getPortletDisplay().getId();
- if( PortletPermissionUtil.contains(permissionChecker,plId,portletId,ActionKeys.CONFIGURATION)){
- //做你想做的事
- }