Vor kurzem mache ich Webentwicklung mit Spring Boot. Ich möchte Sitzungen mit @SessionScope so weit wie möglich verwalten, anstatt HttpSession direkt zu verwenden. Ich habe untersucht, wie die @SeesionScope Bean im Filter referenziert wird.
Name | Ausführung |
---|---|
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 |
Beispielcode und Projekte sind auf [GitHub] verfügbar (https://github.com/devnokiyo/UseSessionScopeBeanInFilter). Bitte schauen Sie, wenn Sie möchten.
Es gibt viele Informationen und der Inhalt der Untersuchung wird später beschrieben, aber ich werde zuerst aus der Schlussfolgerung heraus schreiben. Eine einfache Konfiguration konnte nur mit "@ Autowired" erreicht werden.
UserInfo.kt(@SessionScope)
@Component
@SessionScope
data class UserInfo(
var name: String?
) : Serializable
SessionFilter.kt(OncePerRequestFilter)
@Component
class SessionFilter : OncePerRequestFilter() {
//Es war das gleiche wie bei DI mit Controller.
@Autowired
private lateinit var userInfo: UserInfo
override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {
println("name: ${userInfo.name}")
filterChain.doFilter(request, response)
}
}
Obwohl es sich nicht um ein Buch von Spring Boot 2 handelt, scheint es im Bereich Spring Gründliche Einführung in die Entwicklung von Spring Java-Anwendungen mit Spring Framework DelegatingFilterProxy
berühmt zu sein Es wurde ein Verfahren vorgeschlagen, bei dem XML die Registrierung von Filtern in definiert.
Aus diesem Grund habe ich mich entschlossen, die Methode zuerst mit "DelegatingFilterProxy" auszuprobieren. Ich mag die Art und Weise, wie es in XML definiert ist, nicht, deshalb habe ich es in Java Config (Kotlin) umgeschrieben.
SessionFilter.kt(OncePerRequestFilter)
@Component("SessionFilter") //Ich habe einen Namen angegeben.
class SessionFilter : OncePerRequestFilter() {
:
: (Entspricht dem in der Schlussfolgerung angegebenen Code)
:
}
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@Legt den in Komponente angegebenen Namen fest.
setTargetBeanName("SessionFilter")
}
return arrayOf(dfp)
}
override fun getServletConfigClasses(): Array<Class<*>>? {
return arrayOf(WebConfig::class.java)
}
}
Ich habe einige FAQs gesehen, die in `Filter nicht angezeigt werden können, und die oben genannten Gegenmaßnahmen wurden eingeführt, aber in meiner Umgebung Schlussfolgerung / e02cad0e81ad8ba9d73e #% E7% B5% 90% E8% AB% 96) habe ich den Zweck ohne diese Beschreibung erreicht. Möglicherweise gibt es einen Unterschied zwischen Spring MVC und Spring Boot 2, aber es gibt zu wenig Informationen, um dies zu untersuchen.
Im Vergleich zu anderen bekannten Webframeworks (obwohl ich nicht glaube, dass es sich um ein kleines Webframework handelt) hatte ich den Eindruck, dass Spring-bezogene Informationen oft umständlich und veraltet sind. Daher habe ich zum ersten Mal seit langer Zeit einen Artikel veröffentlicht, in der Hoffnung, dass er für etwas nützlich sein würde.
Recommended Posts