关于Spring Portlet开发中的HandlerInterceptor

简介:

 在Spring Portlet开发中,我们可以用HandlerInterceptor 来实现对于portlet的拦截,主要的需求场景比如授权处理。它可以让我们来自定义处理器执行链。

其实很类似Web开发中的Filter,但是不同的在于Filter是Servlet范畴的概念,它可以用来操作ServletRequest 和ServletResponse,并且配置在web.xml中,而Portlet HandlerInterceptor是Portlet范畴的概念,它可以用来操作PortletRequest和PortletResponse,并且配置在Spring应用上下文中。

在HandlerInterceptor中定义了若干主要方法:具体参见

http://supercharles888.blog.51cto.com/609344/845170

 

为了让我们的应用使用HandlerInterceptor,一个常见的设计模式是使用Adaptor模式,让我们的自定义HandlerInterceptor类继承自HandlerInterceptorAdaptor类,然后进行覆写。 下面是个例子.

 

例子:

a.需求,我们需要在Portlet的任何页面上都可以用到当前登录的用户的用户名和所属权限,那么我们的可以开发一个HandlerInterceptor:

 
 
  1. /** 
  2.  *  
  3.  * This handler interceptor will intercept the request before/after the flow. 
  4.  * Since it is configured in envprovisioning-config.xml ,so it will intercept request to envprovision flow 
  5.  * We can have some pre/post handling work such as initialize the variables 
  6.  *@author cwang58 
  7.  *@created date: Feb 5, 2013 
  8.  */ 
  9. public class EnvProvisionHandlerInterceptor extends HandlerInterceptorAdapter { 
  10.      
  11.     private static final SimpleLogger LOGGER = new SimpleLogger(EnvProvisionHandlerInterceptor.class); 
  12.  
  13.      
  14.     /** 
  15.      * This method will pre handle before rendering the first page in the flow 
  16.      * Here it get the current logined user information from the ThemeDisplay 
  17.      * Then get the role that this user belongs to ,we make sure whether this user belongs to AER Admin-AERAdmin 
  18.      * if user belongs to this ,then set isAdministrator attribute to request scope so that it can be used in every page of this flow. 
  19.      */ 
  20.     @Override 
  21.     public boolean preHandleRender(RenderRequest request, 
  22.             RenderResponse response, Object handler)  { 
  23.         User user = EnvProUtil.getUserObj(request); 
  24.          
  25.         if(user == null){ 
  26.             return false
  27.         } 
  28.         String userName= user.getScreenName(); 
  29.         LOGGER.debug("Login user name:"+userName); 
  30.          
  31.         boolean isAdministrator = false
  32.          
  33.         try
  34.          
  35.         List<Role> roles = user.getRoles(); 
  36.         for(int i= 0;i<roles.size();i++) { 
  37.          
  38.             Role role =roles.get(i); 
  39.             if("AER Admin-AERAdmin".equals(role.getName()) || "Administrator".equals(role.getName())){ 
  40.                 isAdministrator=true
  41.                 LOGGER.debug("Login user has role:"+role.getName()); 
  42.                 break
  43.             } 
  44.         } 
  45.          
  46.  
  47.         request.setAttribute("userId", userName); 
  48.         request.setAttribute("isAdministrator", isAdministrator); 
  49.          
  50.         return true
  51.          
  52.         }catch(SystemException ex){ 
  53.             LOGGER.error("SystemException occurs when get current user role",ex); 
  54.             return false
  55.         } 
  56.     } 
  57.  
  58.      
  59.      
  60.      
  61.      
  62.  

比如以上的例子中,我们从ThemeDisplay中获取当前用户的权限和用户名,然后把它设置到RenderRequest的request scope上。

 

为了让这个HandlerInterceptor生效,我们必须配置这个interceptor在Spring应用上下文中:

 
 
  1. <bean id="portletModeHandlerMapping" class="org.springframework.web.portlet.handler.PortletModeHandlerMapping"> 
  2.         <property name="portletModeMap"> 
  3.             <map> 
  4.                 <entry key="view"> 
  5.                     <bean class="xx.xx.xx.envprovisioning.handlers.EnvProvisionFlowHandler" /> 
  6.                 </entry> 
  7.             </map> 
  8.         </property> 
  9.         <property name="interceptors">   
  10.             <list>   
  11.                 <ref bean="envprovisionhandlerinterceptor"/> 
  12.             </list>   
  13.         </property> 
  14.     </bean> 
  15.     <!-- add interceptor to get user and privilege --> 
  16.     <bean id="envprovisionhandlerinterceptor" class="xx.xx.xx.envprovisioning.interceptors.EnvProvisionHandlerInterceptor"/> 

这样,页面上就可以用el表达式来获取这些信息了。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1159367,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
XML Java Shell
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)
20 1
|
2月前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
79 1
|
2月前
|
XML 存储 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache管理器的实战开发指南(修正篇)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache管理器的实战开发指南(修正篇)
35 0
|
1月前
|
开发框架 安全 Java
探索 Spring 框架:企业级应用开发的强大工具
探索 Spring 框架:企业级应用开发的强大工具
36 2
|
3天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
7 0
|
4天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
46 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
13天前
|
IDE Java 开发工具
Spring Boot DevTools:加速开发的热部署工具
【4月更文挑战第28天】在Spring Boot的开发过程中,快速反馈和效率至关重要。Spring Boot DevTools是一个为开发者设计的模块,支持热部署(hot swapping),能够实现应用的快速重启和自动重载,极大地提高了开发效率。本篇博客将介绍Spring Boot DevTools的核心概念,并通过具体的实战示例展示如何在开发过程中利用这一工具。
23 0
|
17天前
|
开发框架 前端开发 安全
Java从入门到精通:2.2.2学习使用Spring框架进行Web应用开发
Java从入门到精通:2.2.2学习使用Spring框架进行Web应用开发
|
22天前
|
监控 Java 测试技术
使用 Spring Boot 简化企业级应用开发
【4月更文挑战第19天】Spring Boot简化企业级应用开发,加速项目初始化与配置,轻松集成多种技术,降低依赖管理复杂性。它提高开发效率,具备灵活扩展性,便于监控管理,且高度可测试。强大的社区支持解决问题迅速,助力企业快速推出高质量应用,提升市场竞争力。开发者掌握Spring Boot能增强自身价值。
|
23天前
|
前端开发 Java 应用服务中间件
选择 Spring Boot 进行微服务开发的 7 大理由
选择 Spring Boot 进行微服务开发的 7 大理由
22 1