《标记》-在自定义的Spring拦截器中通过request获取到该请求对应于Controller中的目标method方法对象

原创 2015年04月30日 23:46:08
为什么要读取method方法对象?
当然拿到Method对象我们可以做很多事,例如权限认证的时候,判断用户是否有访问该方法的权限。

spring-webmvc-3.1.0.RELEASE及以上版本
最终配置--------------------------------------------begin
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
<property name="interceptors">
<list>
<bean class="com.chenzhou.examples.erm.util.interceptor.LoginInterceptor"/>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

//spring自己的拦截器,测试
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {
System.out.println("*********************preHandle********************");
System.out.println(handler.getClass());
HandlerMethod handlerMethod = (HandlerMethod) handler;
System.out.println(handlerMethod.getMethod());
return true;
}

最终配置--------------------------------------------end


可能的错误
  1. *********************preHandle********************  
  2. class com.chenzhou.examples.erm.web.AdminController  
  3. 2012-10-21 16:28:25 org.apache.catalina.core.StandardWrapperValve invoke  
  4. 严重: Servlet.service() for servlet erm threw exception  
  5. java.lang.ClassCastException: com.chenzhou.examples.erm.web.AdminController cannot be cast to org.springframework.web.method.HandlerMethod  
  6.     at com.chenzhou.examples.erm.util.interceptor.LoginInterceptor.preHandle(LoginInterceptor.java:37)  
  7.     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:891)  
  8.     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)  
  9.     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)  
  10.     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)  
  11.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  
  12.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
  13. ……  

 

    根据错误提示可以看出是HandlerMethod handlerMethod = (HandlerMethod) handler;这一步报错了,根据System.out.println(handler.getClass());打印的结果可以得知handler是该请求访问的Controller类,无法转换成HandlerMethod对象。解决方案是使用

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
替换 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> 

因为DefaultAnnotationHandlerMapping只能返回Controller对象,不会映射到Controller中的方法级别。替换之后配置如下:

 

  1. <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />   
  2. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>  
  3. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">   
  4.     <property name="interceptors">  
  5.         <list>  
  6.             <bean class="com.chenzhou.examples.erm.util.interceptor.LoginInterceptor"/>  
  7.         </list>  
  8.     </property>  
  9. </bean>  

 

    重启tomcat测试之后发现再次报错,报了另外一个错误,具体信息如下:

 

  1. 2012-10-21 16:39:39 org.apache.catalina.core.StandardWrapperValve invoke  
  2. 严重: Servlet.service() for servlet erm threw exception  
  3. javax.servlet.ServletException: No adapter for handler [public org.springframework.web.servlet.ModelAndView com.chenzhou.examples.erm.web.AdminController.init(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]: Does your handler implement a supported interface like Controller?  
  4. ……  

 

    这一次,请求根本没有到达拦截器容器就已经报错了,错误提示的意思是找不到handler对象对应的Adapter类。我在RequestMappingHandlerMapping类对应的spring-webmvc-3.1.0.RELEASE.jar 包里找到了该类对应的Adapter类:RequestMappingHandlerAdapter


版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring拦截器中通过request获取到该请求对应Controller中的method对象

背景:项目使用Spring 3.1.0.RELEASE,从dao到Controller层全部是基于注解配置。我的需求是想在自定义的Spring拦截器中通过request获取到该请求对应于Control...
  • z2007130205
  • z2007130205
  • 2015年08月20日 23:33
  • 4874

拦截器中读取request中的流后,controller 无法获取到数据解决方案

一般我们会在InterceptorAdapter拦截器中对请求的token进行验证 如果是content-type 是 application/x-www-form-urlencoded  则没...
  • Heng_Ji
  • Heng_Ji
  • 2017年02月06日 15:18
  • 4241

java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)

做日志管理最好的是Aop,有的人也喜欢用拦截器。都可以,在此我重点介绍我的实现方式。 Aop有的人说拦截不到Controller。有的人说想拦AnnotationMethodHandlerAdapte...
  • liyisong2008
  • liyisong2008
  • 2015年01月20日 11:33
  • 12507

Spring拦截器中通过request获取到该请求对应Controller中的method对象

背景:项目使用Spring 3.1.0.RELEASE,从dao到Controller层全部是基于注解配置。我的需求是想在自定义的Spring拦截器中通过request获取到该请求对应于Control...
  • xwq911
  • xwq911
  • 2016年05月12日 14:28
  • 341

自定义拦截器与Ation传递复杂对象到Request源码

  • 2010年01月04日 20:52
  • 3.25MB
  • 下载

spring mvc 自定义方法拦截器

自定义方法拦截器   @interface 属于annotation 注解 import java.lang.annotation.ElementType; import java.lang.ann...
  • yataiheping
  • yataiheping
  • 2016年06月20日 14:40
  • 224

CXF+Spring+自定义拦截器 WebService实例源码下载

  • 2016年04月19日 13:31
  • 19.69MB
  • 下载

CXF3.0+Spring3.2 自定义拦截器

  • 2016年01月06日 16:17
  • 8.82MB
  • 下载

Spring MVC--13.自定义拦截器

  • 2017年09月05日 20:24
  • 12.46MB
  • 下载

Spring自定义注解实现Controller对象获取

Spring原生提供 @RequestBody用于将客户端传递的Json对象转化为Java Object。 所依赖的就是RequestMappingHandlerAdapter。 它已经被集成在 之中...
  • qyp199312
  • qyp199312
  • 2015年01月30日 16:46
  • 3071
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《标记》-在自定义的Spring拦截器中通过request获取到该请求对应于Controller中的目标method方法对象
举报原因:
原因补充:

(最多只允许输入30个字)