我的项目实际使用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");
}
现在,当我与其他用户一起登录时,这些全局变量仍然保持相同的值。
所以我想知道:如何在注销后启动这些全局变量?
答案 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。
然而,可能不是最好的设计,但我需要更多关于你想要实现的细节。