基于 url 的多语言登录页面



我在 Spring Boot 应用程序中将语言环境作为 url 的一部分:

/site - default locale
/en/site - English locale

我为此使用自定义拦截器:

    import org.springframework.beans.propertyeditors.LocaleEditor
    import org.springframework.util.Assert
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter
    import org.springframework.web.servlet.support.RequestContextUtils
    import javax.servlet.ServletException
    import javax.servlet.http.HttpServletRequest
    import javax.servlet.http.HttpServletResponse
    import java.util.Locale
    import java.util.regex.Pattern
    class CustomLocaleChangeInterceptor : HandlerInterceptorAdapter() {
    private var localePattern: Pattern? = null
    private fun setLocalePattern(localePattern: String) {
        Assert.isTrue(localePattern.matches(".*\(.*\).*".toRegex()), "Your pattern needs to define a match group")
        this.localePattern = Pattern.compile(localePattern)
    }
    @Throws(ServletException::class)
    override fun preHandle(request: HttpServletRequest?, response: HttpServletResponse?, handler: Any?): Boolean {
        this.setLocalePattern("(en)")
        val pathTranslated = request!!.requestURI.substring(request.contextPath.length)
        if (pathTranslated.isNotEmpty()) {
            val matcher = localePattern!!.matcher(pathTranslated)
            if (matcher.find()) {
                resolver(request, response, matcher.group(1))
            } else {
                resolver(request, response, "th")
            }
        }
        // Proceed in any case.
        return true
    }
    private fun resolver(request: HttpServletRequest, response: HttpServletResponse?, locale: String) {
        val localeResolver = RequestContextUtils.getLocaleResolver(request) ?: throw IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?")
        val localeEditor = LocaleEditor()
        localeEditor.asText = locale
        localeResolver.setLocale(request, response, localeEditor.value as Locale)
    }
}

问题是在Spring中处理两个自定义登录页面的最佳方法是什么?当受限制的 url 包含/en 时,应将用户重定向到/en/login 页面(使用英语),否则如果页面具有默认区域设置,则应重定向到/login url(使用默认语言)

在 spiring security 中,您可以使用这个

import java.io.IOException;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
    @Component
    public class Securityhandler implements AuthenticationSuccessHandler {
    public void onAuthenticationSuccess(HttpServletRequest request,   HttpServletResponse response, Authentication authentication) throws IOException  {
    Local local= LocaleContextHolder.getLocale();
    if(local.equals("yourcodeLang"){
       response.sendRedirect("/yourUrl");
    }
    else // your logic
    }
    }

并像这样更新您的配置:

   @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
              .anyRequest().authenticated()
              ....
              .successHandler(yourSuccessHandlerBean) // autowired or defined 
              ...
      }

同时,我找到了这个解决方案。也许不完美,但它有效。

@EnableWebSecurity
@Order(1)
class SecurityConfigTH : WebSecurityConfigurerAdapter() {
    private val localePattern: Pattern = Pattern.compile("^/en($|/)")
    @Throws(Exception::class)
    override fun configure(http: HttpSecurity) {
        http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .requestMatcher { !localePattern.matcher(it.requestURI.toString()).find() }
                .formLogin()
                    .loginPage("/login")
                    .permitAll()
    }
}
@EnableWebSecurity
@Order(2)
class SecurityConfigEN : WebSecurityConfigurerAdapter() {
    private val localePattern: Pattern = Pattern.compile("^/en($|/)")
    @Throws(Exception::class)
    override fun configure(http: HttpSecurity) {
        http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .requestMatcher { localePattern.matcher(it.requestURI.toString()).find() }
                    .formLogin()
                    .loginPage("/en/login")
                    .permitAll()
    }
}

最新更新