Récemment, je fais du développement Web avec Spring Boot. J'aimerais autant que possible gérer les sessions avec @SessionScope au lieu d'utiliser HttpSession directement. J'ai étudié comment référencer le @SeesionScope Bean dans le filtre.
Nom | version |
---|---|
macOS | Catalina 10.15.4 |
IntelliJ IDEA | 2019.3.4 (Community Edition) |
Java | "11.0.2" 2019-01-15 |
Spring Boot | 2.2.6 |
Kotlin | 1.3.71 |
Des exemples de code et de projets sont disponibles sur GitHub. Jetez un œil si vous le souhaitez.
Il y a beaucoup d'informations et le contenu de l'enquête sera décrit plus tard, mais j'écrirai d'abord à partir de la conclusion.
Une configuration simple ne peut être réalisée qu'avec @ Autowired
.
UserInfo.kt(@SessionScope)
@Component
@SessionScope
data class UserInfo(
var name: String?
) : Serializable
SessionFilter.kt(OncePerRequestFilter)
@Component
class SessionFilter : OncePerRequestFilter() {
//C'était la même chose que DI avec contrôleur.
@Autowired
private lateinit var userInfo: UserInfo
override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {
println("name: ${userInfo.name}")
filterChain.doFilter(request, response)
}
}
Bien que ce ne soit pas un livre de Spring Boot 2, il semble être célèbre dans la région de Spring Présentation approfondie du développement d'applications Spring Java avec Spring Framework DelegatingFilterProxy
Une méthode a été proposée pour définir en XML pour enregistrer un filtre dans.
Par conséquent, j'ai décidé d'essayer la méthode en utilisant d'abord DelegatingFilterProxy
. Je n'aime pas la façon dont il est défini en XML, alors je l'ai réécrit dans Java Config (Kotlin).
SessionFilter.kt(OncePerRequestFilter)
@Component("SessionFilter") //Je spécifiais un nom.
class SessionFilter : OncePerRequestFilter() {
:
: (Identique au code affiché dans la conclusion)
:
}
WebInitializer.kt
class WebInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
override fun getRootConfigClasses(): Array<Class<*>>? {
return null
}
override fun getServletMappings(): Array<String> {
return arrayOf("/")
}
override fun getServletFilters(): Array<Filter> {
val dfp = DelegatingFilterProxy().apply {
// SessionFilter.kt@Définit le nom spécifié dans Component.
setTargetBeanName("SessionFilter")
}
return arrayOf(dfp)
}
override fun getServletConfigClasses(): Array<Class<*>>? {
return arrayOf(WebConfig::class.java)
}
}
J'ai vu quelques FAQ qui ne peuvent pas DI dans `Filter, et les contre-mesures ci-dessus ont été introduites, mais dans mon environnement, Conclusion / e02cad0e81ad8ba9d73e #% E7% B5% 90% E8% AB% 96), j'ai atteint l'objectif sans cette description. Il peut y avoir une différence entre Spring MVC et Spring Boot 2, mais il y a trop peu d'informations à étudier.
Comparé à d'autres frameworks Web bien connus (bien que je ne pense pas que ce soit un framework Web mineur), j'ai eu l'impression que les informations relatives à Spring sont souvent lourdes et héritées. Par conséquent, j'ai posté un article pour la première fois depuis longtemps, en espérant qu'il serait utile pour quelque chose.
Recommended Posts