如何配置Session-Scoped bean以便能够从请求和其他服务访问信息?

时间:2011-07-17 13:07:28

标签: java spring spring-mvc

为了使这个会话范围的bean工作,它需要访问Request对象以允许它确定登录用户的权限。

它还需要能够访问userService - 另一个bean。

获取这些资源需要什么?

@Configuration
public class ExceptionResolverBuilder 
{
    @Bean @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public ExceptionResolver getExceptionResolver() 
    {

        ExceptionResolver er = new ExceptionResolver();

        User user = userService.getLoggedInUser(request);

        if(user.isAdmin())
        {
            sendEmail("Caught exception:" + exeption.getMessage());
        }
        else
        {
            writeLog("Caught exception:" + exeption.getMessage());              
        }

        return er;
    }

}

3 个答案:

答案 0 :(得分:1)

相反令人讨厌的是,会话范围的bean无法轻松访问发起会话的请求。

但是,在您的情况下,您不需要。假设your ExceptionResolver is an implementation of HandlerExceptionResolver,则没有理由将您的记录逻辑放入ExceptionResolverBuilder.getExceptionResolver(),因为解析器将通过HttpServletRequest方法中的当前resolveException传递。

另外,请考虑使用@ExceptionResolver注释,这会让生活变得更轻松,还可以使用gets access to the current request

答案 1 :(得分:0)

  

为了使这个会话范围的bean工作,它需要访问Request对象以允许它确定登录用户的权限。

AFAIK,如果当前请求已作为参数传递,或者通过本地线程传递,则只能获取当前请求。

如果您使用的是SpringSecurity,则可以通过调用SecurityContext.getContext()来获取当前请求的身份验证信息。 (这通常使用本地线程。)但是,我不确定这是否可行,因为在未设置安全上下文时可能会调用您的方法。

  

它还需要能够访问userService - 另一个bean。

您需要安排这是由依赖注入提供的。

答案 2 :(得分:0)

对于定义为@Component的bean,您可以像这样自动装配HttpServletRequest:

@Component
@Scope("session")
public class Foo {
    @Autowired private HTTPServletRequest request;

    //
}

但是,由于您使用@Bean,因此无法执行此操作。

您可以按如下方式获取当前请求:

    ServletRequestAttributes sra = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
    HttpServletRequest req = sra.getRequest();     

这使用了本地的线程本地。

如果您正在使用Spring MVC,那就是您所需要的一切。如果您没有使用Spring MVC,那么您需要在web.xml中注册RequestContextListenerRequestContextFilter