【问题标题】:Set an object in session automatically自动在会话中设置对象
【发布时间】:2011-04-03 03:01:16
【问题描述】:

我正在使用 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>

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

【问题讨论】:

  • 我无法回答您的问题,但前几天我正在查看 spring api 并找到了 DefaultSessionAttributeStore。它允许您在控制器的会话中设置和删除某些属性,如下所示: public ModelAndView procesarLogin(DefaultSessionAttributeStore status, WebRequest request) {...status.storeAttribute(request, attributeName, attributeValue); status.cleanupAttribute(request, attributeName);}

标签: java spring-mvc spring-security


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果您将Usuario 对象放入会话中,因为您想在控制器的其他方法(或其他控制器)中重用它,那么更好更简洁的方法是将其注入方法本身,如下所示:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-08-26
        • 2014-04-22
        • 1970-01-01
        • 2019-10-16
        • 2012-01-01
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        相关资源
        最近更新 更多