注销后如何启动全局变量?

时间:2016-03-19 09:08:09

标签: spring session gradle global-variables logout

我的项目实际使用spring + gradle系统, 在一些控制器文件中,我添加了一些像这样的全局变量:

@Controller
@RequestMapping(value = "/admin/question")
public class QuestionAdminController {

List<Question> questions;
String message;
Company company;

这是我的WebSecurityConfigurerAdapter类:

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable(); // temporary disabled for testing file upload
    http.headers().frameOptions().disable(); // disabled for h2 console
    // Roles permissions        
    http.authorizeRequests()
            // Directories access permissions
            .antMatchers("/user/**").access("hasRole('USER')")
            .antMatchers("/company/**").access("hasRole('COMPANY')")
            .antMatchers("/admin/**").access("hasRole('ADMIN')")
            .antMatchers("/db/**").access("hasRole('DBA')")
            // All user can access to new routes at the root
            .antMatchers("/**").permitAll()
            // Other requests need the login
            .anyRequest().authenticated()
            // Configure the login page
            .and().formLogin().loginPage("/login").successHandler(customSuccessHandler).permitAll()
            // Default logout from Spring Security
            .and().logout().permitAll()
            .and()
            .sessionManagement()
            .maximumSessions(1).expiredUrl("/login?expired");
}

现在,当我与其他用户一起登录时,这些全局变量仍然保持相同的值。

所以我想知道:如何在注销后启动这些全局变量?

2 个答案:

答案 0 :(得分:0)

控制器不是初始化和存储会话状态或用户特定数据的最佳位置。默认情况下,Controller具有单例范围,因此它由服务于用户请求的所有线程共享。

您需要将用户特定数据提取到一个单独的类中,该类在应用程序上下文中具有会话范围。每次启动新用户会话时都会初始化bean。使用Java配置的示例

public class UserData{
   List<Questions> questions;
   String message;
  // etc
}
     //in your @Configuration class

        @Bean
        @Scope("session")
        @ScopedProxy
        public UserData userData(){
           //initialize and return user data
        }

In your controller inject UserData as follows

    @Controller
        @RequestMapping(value = "/admin/question")
        public class QuestionAdminController {

           @Autowired
           private UserData userData;
        }

NB.Your UserData bean需要是一个作用域代理,因为它注入的控制器具有更长的范围。因此代理有责任从会话中查找bean或者如果它不存在则创建它

答案 1 :(得分:0)

如果您将UserData声明为会话作用域,则@PostConstruct&amp;创建或销毁会话时将执行@PreDestroy注释方法。在那里你可以操纵全球的pareameters。

然而,可能不是最好的设计,但我需要更多关于你想要实现的细节。