From 4f9c431d9b5bcf3837e988ebea3ff717e30d50ac Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 4 Sep 2024 18:55:10 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E3=82=AF=E3=82=A8=E3=83=AA=E3=83=91?= =?UTF-8?q?=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF=E3=81=A7SSR=E3=82=92?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E3=81=99=E3=82=8B=E3=81=8B=E3=82=92=E5=88=87?= =?UTF-8?q?=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SSRを使用するかの設定はセッショに保存され、次のアクセスから設定する必要はなくなる サーバーはとりあえずSPA用のindexページを送信し、noscriptを検知してクエリパラメータ付きのページに遷移する --- .../hideout/core/config/WebMvcConfig.kt | 13 ++++++ .../springframework/SPAInterceptor.kt | 46 +++++++++++++++++++ .../src/main/resources/templates/index.html | 18 ++++++++ 3 files changed, 77 insertions(+) create mode 100644 hideout-core/src/main/kotlin/dev/usbharu/hideout/core/config/WebMvcConfig.kt create mode 100644 hideout-core/src/main/kotlin/dev/usbharu/hideout/core/infrastructure/springframework/SPAInterceptor.kt create mode 100644 hideout-core/src/main/resources/templates/index.html diff --git a/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/config/WebMvcConfig.kt b/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/config/WebMvcConfig.kt new file mode 100644 index 00000000..d940f617 --- /dev/null +++ b/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/config/WebMvcConfig.kt @@ -0,0 +1,13 @@ +package dev.usbharu.hideout.core.config + +import dev.usbharu.hideout.core.infrastructure.springframework.SPAInterceptor +import org.springframework.context.annotation.Configuration +import org.springframework.web.servlet.config.annotation.InterceptorRegistry +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer + +@Configuration +class WebMvcConfig(private val spaInterceptor: SPAInterceptor) : WebMvcConfigurer { + override fun addInterceptors(registry: InterceptorRegistry) { + registry.addInterceptor(spaInterceptor) + } +} \ No newline at end of file diff --git a/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/infrastructure/springframework/SPAInterceptor.kt b/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/infrastructure/springframework/SPAInterceptor.kt new file mode 100644 index 00000000..7f525144 --- /dev/null +++ b/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/infrastructure/springframework/SPAInterceptor.kt @@ -0,0 +1,46 @@ +package dev.usbharu.hideout.core.infrastructure.springframework + +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import org.springframework.stereotype.Component +import org.springframework.web.servlet.HandlerInterceptor +import org.springframework.web.servlet.ModelAndView +import org.springframework.web.servlet.support.ServletUriComponentsBuilder + +@Component +class SPAInterceptor : HandlerInterceptor { + + override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean { + + if (request.getParameter("s") == "f") { + request.session.setAttribute("s", "f") + } else if (request.getParameter("s") == "t") { + request.session.setAttribute("s", "t") + } + return true + } + + override fun postHandle( + request: HttpServletRequest, + response: HttpServletResponse, + handler: Any, + modelAndView: ModelAndView? + ) { + if (request.session.getAttribute("s") == "f") { + return + } + val title = modelAndView?.modelMap?.getOrDefault("title", "") + val url = modelAndView?.modelMap?.getOrDefault( + "url", + ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString() + '?' + request.queryString + ) + val description = modelAndView?.modelMap?.getOrDefault("description", "") + val image = modelAndView?.modelMap?.get("image") + + modelAndView?.clear() + modelAndView?.addObject("nsUrl", request.requestURI + "?s=f" + request.queryString?.let { "&$it" }.orEmpty()) + modelAndView?.addAllObjects(mapOf("title" to title, "url" to url, "description" to description)) + image?.let { modelAndView?.addObject("image", it) } + modelAndView?.viewName = "index" + } +} \ No newline at end of file diff --git a/hideout-core/src/main/resources/templates/index.html b/hideout-core/src/main/resources/templates/index.html new file mode 100644 index 00000000..5caf7bd2 --- /dev/null +++ b/hideout-core/src/main/resources/templates/index.html @@ -0,0 +1,18 @@ + + + + + Title + + + + + + + + + + + \ No newline at end of file