java - 如何在定制的 AOP 顾问程序中获取 HttpServletRequest?

标签 java spring spring-mvc spring-aop

上下文:
在我的 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,异常仍然建议使用 RequestContextListenerRequestContextFilter

我在 Stack Overflow 和其他地方进行了很多搜索,但一无所获。任何帮助将不胜感激! (老问题请多包涵:P)

更新:

我想我指的是实际 Web 请求之外的请求属性,这就是 RequestContextListener 不起作用的原因?

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

最佳答案

供 future 开发者引用:
当您收到 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();

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

区别如下:
Inside class:它只是一个需要在初始化时创建的对象,它会抛出异常,因为在这个阶段根本没有请求!
内部方法:当有实际请求进入时,它将在运行时创建。这将工作得很好。

关于java - 如何在定制的 AOP 顾问程序中获取 HttpServletRequest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22335206/

相关文章:

java - 安装web3j时无法编码的字符无法编码

java - 有没有办法加快许多循环的递归?

java - spring和eclipse链接刷新?

java - 如何装饰所有请求以从 header 中取值并将其添加到正文参数中?

java - Hazelcast 的 IScheduledExecutorService 无法序列化任务

java - 关于XML构造函数注入(inject)Spring配置究竟如何工作的一些疑问?

java - 获取音频输出设备(扬声器、耳机)的 GUID

java - 从备用位置下载文件

java - 以编程方式刷新 spring mvc 资源包

performance - Grails 中从服务返回到 Controller 的时间