上下文:
在我的 Spring MVC 应用程序中,我有一个拦截 Controller 方法的顾问(我的 AOP 工作正常)。在建议类中,我试图通过调用 HttpServletRequest.getRemoteUser() 来提取信息。然后我需要从数据库中加载用户的权限。
我的代码
拦截器类(实现 MethodInterceptor
):
private HttpServletRequest request = ((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>
结果/问题:
我仍然得到 java.lang.IllegalStateException: No thread-bound request found
,异常仍然建议使用 RequestContextListener
或 RequestContextFilter
。
我在 Stack Overflow 和其他地方进行了很多搜索,但一无所获。任何帮助将不胜感激! (老问题请多包涵:P)
更新:
我想我指的是实际 Web 请求之外的请求属性,这就是 RequestContextListener 不起作用的原因?
有什么方法我仍然可以获得当前请求吗?
最佳答案
供 future 开发者引用:
当您收到 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();
确保将代码放在方法中而不是方法的类中!
区别如下:
Inside class:它只是一个需要在初始化时创建的对象,它会抛出异常,因为在这个阶段根本没有请求!
内部方法:当有实际请求进入时,它将在运行时创建。这将工作得很好。
关于java - 如何在定制的 AOP 顾问程序中获取 HttpServletRequest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22335206/