关于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,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
63 4
|
16天前
|
XML JSON Java
Spring Boot 开发中常见的错误
本文总结了 Java 开发中常见的几个问题及其改进方法,包括:1. 过度使用 `@Component` 注解;2. `@ResponseBody` 注解的错误用法;3. `@Autowired` 的不当使用;4. `application.properties` 管理不善;5. 异常处理不当。每部分详细解释了错误情况和建议的改进方案,并提供了相应的代码示例。
47 11
|
9天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
186 0
|
17天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
34 5
|
15天前
|
前端开发 Java 开发者
这款免费 IDEA 插件让你开发 Spring 程序更简单
Feign-Helper 是一款支持 Spring 框架的 IDEA 免费插件,提供 URL 快速搜索、Spring Web Controller 路径一键复制及 Feign 与 Controller 接口互相导航等功能,极大提升了开发效率。
|
2月前
|
前端开发 JavaScript Java
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
46 1
|
21天前
|
XML Java 数据格式
Spring Boot 开发中的常见失误
本文深入分析了Spring Boot开发中常见的失误,包括不当使用@Component、@ResponseBody、@Autowired注解,以及不良的异常处理和日志记录实践,提供了有效的规避策略,帮助开发者提升代码质量和系统性能。
|
2月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
50 2
|
3月前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。
|
4月前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
3160 15