如何在定制的AOP顾问中获得HttpServletRequest?

时间:2014-03-11 19:51:30

标签: java spring spring-mvc spring-aop

上下文
在我的Spring MVC应用程序中,我有一个截取控制器方法的顾问(我的AOP工作正常)。在advice类中,我试图通过调用HttpServletRequest.getRemoteUser()来提取信息。然后我需要从DB加载用户的权限
我的代码
拦截器类(实现MethodInterceptor):

  

私有HttpServletRequest请求=((ServletRequestAttributes)
  。RequestContextHolder.currentRequestAttributes())Request()方法;

web.xml

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

结果/问题

我仍然得到java.lang.IllegalStateException: No thread-bound request found,例外情况仍然建议使用RequestContextListenerRequestContextFilter

我在Stack Overflow和其他地方搜索过很多但没有运气。任何帮助将不胜感激! (请问我老问题:P)

更新

我认为我指的是实际Web请求之外的请求属性,这就是RequestContextListener没有帮助的原因?

我有什么方法可以获得当前的请求吗?

1 个答案:

答案 0 :(得分:2)

供将来开发人员参考
如果您收到java.lang.IllegalStateException: No thread-bound request found exception建议使用RequestContextListenerRequestContextFilter

您可能遇到以下两种情况之一。

情况NO.1

您没有使用org.springframework.web.servlet.DispatcherServlet(例如,它不在您的web.xml中,或者它不是Spring MVC应用程序)。
然后,您可能希望将RequestContextListener添加到您的web.xml:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

RequestContextFilter(做同样的事情):

<filter>
  <filter-name>requestContextFilter</filter-name>
  <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>requestContextFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

然后你的代码应该开始工作。

情况NO.2

您希望在其原始上下文之外访问HttpServletRequest,然后以下代码应该有所帮助:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

确保将代码放在方法中,而不是放在方法的类中!

区别如下:
内部类:它只是一个需要在初始化时创建的对象,这将抛出异常,因为在此阶段没有任何请求!
内部方法:当有实际请求进入时,它将在运行时创建。这将完全正常。