Java 如何在定制的AOP advisor中获取HttpServletRequest?
上下文:Java 如何在定制的AOP advisor中获取HttpServletRequest?,java,spring,spring-mvc,spring-aop,Java,Spring,Spring Mvc,Spring Aop,上下文: 在我的SpringMVC应用程序中,我有一个拦截控制器方法的顾问(我的AOP工作得很好)。在advice类中,我试图通过调用HttpServletRequest.getRemoteUser()来提取信息。然后我需要从DB加载用户权限。 我的代码 拦截器类(实现MethodInterceptor): 私有HttpServletRequest=((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(
在我的SpringMVC应用程序中,我有一个拦截控制器方法的顾问(我的AOP工作得很好)。在advice类中,我试图通过调用HttpServletRequest.getRemoteUser()来提取信息。然后我需要从DB加载用户权限。
我的代码 拦截器类(实现
MethodInterceptor
):
私有HttpServletRequest=((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest() 在
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>
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
调度员
org.springframework.web.servlet.DispatcherServlet
1.
调度员
/
结果/问题:
我仍然得到java.lang.IllegalStateException:未找到线程绑定的请求
,异常仍然建议使用RequestContextListener
或RequestContextFilter
我已经搜索了很多关于堆栈溢出和其他地方,但没有运气。任何帮助都将不胜感激!(请接受我的老问题:P)
更新:
我想我指的是实际web请求之外的请求属性,这就是为什么RequestContextListener没有帮助
我还有什么办法可以得到当前的请求吗?供将来的开发者参考。:
当您获得
java.lang.IllegalStateException:No thread bound request found exception
时,建议使用RequestContextListener
或RequestContextFilter
您可能遇到了以下两种情况之一
情况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>
那么你的代码就应该开始工作了
第二种情况
您希望在HttpServletRequest的原始上下文之外访问它,那么以下代码应该会有所帮助:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
确保将代码放在方法中,而不是放在方法的类中强>
区别如下:类内部:只是在初始化时需要创建一个对象,这将引发异常,因为在这个阶段根本没有请求!
内部方法:当有实际请求传入时,它将在运行时创建。这将非常好。什么编辑?请发布完整的堆栈跟踪。@Taylor我已经添加了堆栈跟踪。(我删除了一些行。它是400+)看起来这是在初始化时触发的,这意味着不会有请求。您应该让Aspect按需检索请求,或者委托给原型范围的bean。
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();