上下文
在我的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
,例外情况仍然建议使用RequestContextListener
或RequestContextFilter
。
我在Stack Overflow和其他地方搜索过很多但没有运气。任何帮助将不胜感激! (请问我老问题:P)
更新
我认为我指的是实际Web请求之外的请求属性,这就是RequestContextListener没有帮助的原因?
我有什么方法可以获得当前的请求吗?
答案 0 :(得分:2)
供将来开发人员参考:
如果您收到java.lang.IllegalStateException: No thread-bound request found exception
建议使用RequestContextListener
或RequestContextFilter
。
您可能遇到以下两种情况之一。
情况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();
确保将代码放在方法中,而不是放在方法的类中!
区别如下:
内部类:它只是一个需要在初始化时创建的对象,这将抛出异常,因为在此阶段没有任何请求!
内部方法:当有实际请求进入时,它将在运行时创建。这将完全正常。