使用HttpRequest初始化Spring会话Bean(使用注释)

时间:2016-07-25 12:26:35

标签: java spring spring-mvc session

我正在尝试构建(或扩充)使用Spring bean的webapp,并使用注释进行初始化。我有一个我需要初始化的bean,但是bean需要HttpServletRequest来正确初始化(它是用户身份bean)。

我浏览了文档,我已经看到了我需要的部分,但这些部分似乎并没有组装成一个完整的解决方案。

伪示例:

@Configuration
public class MyConfig {
    @Bean
    public UserBean userBean() {
        // initialize with HttpRequest somehow?
    }
}

@Controller
public class MyController {
    @Resource
    UserBean userBean;

    @RequestMapping(value="/userId", method=RequestMethod.GET)
    public String getUserInfo() {
        // do stuff with the initialized user bean here
    }
}

请注意,有多个控制器类,所以我不确定首先会遇到哪个。

我看到可以做的两件事:

  1. MyConfig类中以懒惰方式初始化bean。但我不确定如何访问HttpServletRequest对象。
  2. 使用getUserInfo()方法将bean注入会话。但是,类中的每个方法都可能需要相同的初始化逻辑,而且我不确定如何将初始化的UserBean注入到会话中,以便其他控制器可以访问同一个UserBean。
  3. 任何帮助/建议/等。将不胜感激

2 个答案:

答案 0 :(得分:1)

看起来你缺少的是“spring scoped beans”功能。

基本上,scoped bean是由spring管理(创建/销毁)的bean,因此您不必担心这一点。您也不必担心初始化。 Spring会为你处理它。

请试试这个。将Scope定义添加到UserBean并将HttpServletRequest注入您的UserBean

@Bean
@Scope("request")
public UserBean userBean() {
    return new UserBean();
}

@Component
public class UserBean {

  @Inject
  HttpServletRequest request;

  @PostConstruct
  public void init(){
    // Access request object to initialize your object
  }
}

修改

如果您无法修改UserBean,您可以获得请求&在java配置中初始化bean。例如:

HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder

@Bean
@Scope("request")
public UserBean userBean() {
   HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
   return new UserBean(request);
}

答案 1 :(得分:0)

如果我理解正确,您正在尝试创建某种服务器端会话存储。

如果是这种情况,您最好的选择可能是使用Servlet环境附带的会话处理。根据Spring文档,javax.servlet.http.HttpServletRequest - 带注释的方法可以采用getSession()类型的参数。

在此对象上,您可以使用UserBean方法获取用户的会话,或者如果不存在则生成新会话。你的setAttribute(String, Object) - 类不再是bean了,只是一个普通的对象。您可以使用getAttribute(String)将其存储在会话中,并使用UserBean - 方法进行阅读。

无论您使用何种控制器,此会话对象都应包含相同的{{1}}对象。