在会话中自动设置对象

问题描述:

我正在开发一个使用spring mvc,spring security和hibernate的web应用程序。在会话中自动设置对象

有什么办法可以自动设置与用户凭证的会话中的对象?我的意思是,我目前的代码中,我手动用户对象设置为会话:

@RequestMapping(value = { "/privados/procesarLogin", 
     "/sesiones/procesarLogin" }, method = RequestMethod.GET) 
public ModelAndView procesarLogin(HttpServletRequest req) { 
    ModelAndView mav = new ModelAndView(); 
    String usuario = (String) SecurityContextHolder.getContext() 
      .getAuthentication().getCredentials(); 
    Usuario usuarioSesion = us.retornarUsuario(usuario); 
    HttpSession sesion = req.getSession(true); 
    sesion.setAttribute("usuarioSesion", usuarioSesion); 
    mav.setViewName("/privados/principal"); 
    return mav; 
} 

,但我赢了创建用户对象,并自动将其放置在会议结束后他的登录认证成功。 我应该如何配置我的xml文件?我目前的一个是:

//头

<global-method-security secured-annotations="enabled" /> 

<http auto-config="true" access-denied-page="/app/sesiones/procesarLogin"> 

    <logout logout-success-url="/app/sesiones/login" /> 
    <form-login authentication-failure-url="/app/sesiones/login?error=true" 
     login-page="/app/sesiones/login" default-target-url="/app/sesiones/procesarLogin" /> 
    <intercept-url pattern="/app/privados/*" access="ROLE_USER" /> 
</http> 

<authentication-manager> 
    <authentication-provider> 
     <jdbc-user-service data-source-ref="dataSource" 
      users-by-username-query="Select usuario, contrasena,true from Usuarios where usuario=?" 
      authorities-by-username-query="Select usuario, role from Usuarios where usuario=?" /> 
     <password-encoder ref="passwordEncoder" /> 
    </authentication-provider> 
</authentication-manager> 

<beans:bean id="jasyptPasswordEncryptor" 
    class="org.jasypt.util.password.BasicPasswordEncryptor" /> 

<beans:bean id="passwordEncoder" class="org.jasypt.spring.security3.PasswordEncoder"> 
    <beans:property name="passwordEncryptor"> 
     <beans:ref bean="jasyptPasswordEncryptor" /> 
    </beans:property> 
</beans:bean> 

我希望你的帮助 提前感谢!

+0

我无法回答你的问题,但我在前一天通过spring api查找并发现了DefaultSessionAttributeStore。它允许您设置和删除控制器中的会话中的某些属性,如下所示:public ModelAndView procesarLogin(DefaultSessionAttributeStore status,WebRequest request){... status.storeAttribute(request,attributeName,attributeValue); status.cleanupAttribute(request,attributeName);} – blong824 2011-03-30 15:35:39

您可以使用scope = session创建一个bean,当会话创建时它将实例化它。见3.4 Bean Scopes

希望这会有所帮助。

如果你是把在会议Usuario对象,因为你想重用它在​​控制器(或其他控制器)的其他方法,那么更好的和更清洁的方式将注入它的方法本身如下:

@RequestMapping(value = { "/privados/procesarLogin", 
    "/sesiones/procesarLogin" }, method = RequestMethod.GET) 
public ModelAndView procesarLogin(HttpServletRequest req, Usuario usuario) { 
/* Use usuario */ 
... 
} 

为此,您必须执行WebArgumentResolver并将其注册为AnnotationMethodHandlerAdapter。将您现有的代码转移到您的WebArgumentResolver实现的resolveArgument方法;也就是说,首先在会话中检查usuario,否则从SecurityContextHolder建立它。

Spring还提供了一个HandlerInterceptors,它可以为每个请求自动执行并且只能编程一次。有点像servlet过滤器,但拦截器允许在处理请求之前和之后进行交互。