Spring Security默认登录页面代码位于哪里?


问:Spring Security默认登录页面代码位于哪里?

答:它是从此类生成的org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter。通过反编译spring-security-web-5.5.2.jar可查看源码如下:

private String generateLoginPageHtml(HttpServletRequest request, boolean loginError, boolean logoutSuccess) {
        String errorMsg = "Invalid credentials";
        if (loginError) {
            HttpSession session = request.getSession(false);
            if (session != null) {
                AuthenticationException ex = (AuthenticationException)session.getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
                errorMsg = ex != null ? ex.getMessage() : "Invalid credentials";
            }
        }

        String contextPath = request.getContextPath();
        StringBuilder sb = new StringBuilder();
        sb.append("\n");
        sb.append("\n");
        sb.append("  \n");
        sb.append("    \n");
        sb.append("    \n");
        sb.append("    \n");
        sb.append("    \n");
        sb.append("    Please sign in\n");
        sb.append("    \n");
        sb.append("    \n");
        sb.append("  \n");
        sb.append("  \n");
        sb.append("     
\n"); if (this.formLoginEnabled) { sb.append("
this.authenticationUrl + "\">\n"); sb.append(" \n"); sb.append(createError(loginError, errorMsg) + createLogoutSuccess(logoutSuccess) + "

\n"); sb.append(" \n"); sb.append(" this.usernameParameter + "\" class=\"form-control\" placeholder=\"Username\" required autofocus>\n"); sb.append("

\n"); sb.append("

\n"); sb.append(" \n"); sb.append(" this.passwordParameter + "\" class=\"form-control\" placeholder=\"Password\" required>\n"); sb.append("

\n"); sb.append(this.createRememberMe(this.rememberMeParameter) + this.renderHiddenInputs(request)); sb.append(" \n"); sb.append("
\n"); } if (this.openIdEnabled) { sb.append("
this.openIDauthenticationUrl + "\">\n"); sb.append(" \n"); sb.append(createError(loginError, errorMsg) + createLogoutSuccess(logoutSuccess) + "

\n"); sb.append(" \n"); sb.append(" this.openIDusernameParameter + "\" class=\"form-control\" placeholder=\"Username\" required autofocus>\n"); sb.append("

\n"); sb.append(this.createRememberMe(this.openIDrememberMeParameter) + this.renderHiddenInputs(request)); sb.append(" \n"); sb.append("
\n"); } Iterator var7; Entry relyingPartyUrlToName; String url; String partyName; if (this.oauth2LoginEnabled) { sb.append(""); sb.append(createError(loginError, errorMsg)); sb.append(createLogoutSuccess(logoutSuccess)); sb.append("\n"); var7 = this.oauth2AuthenticationUrlToClientName.entrySet().iterator(); while(var7.hasNext()) { relyingPartyUrlToName = (Entry)var7.next(); sb.append(" \n"); } sb.append("
"); url = (String)relyingPartyUrlToName.getKey(); sb.append(""); partyName = HtmlUtils.htmlEscape((String)relyingPartyUrlToName.getValue()); sb.append(partyName); sb.append(""); sb.append("
\n"); } if (this.saml2LoginEnabled) { sb.append(""); sb.append(createError(loginError, errorMsg)); sb.append(createLogoutSuccess(logoutSuccess)); sb.append("\n"); var7 = this.saml2AuthenticationUrlToProviderName.entrySet().iterator(); while(var7.hasNext()) { relyingPartyUrlToName = (Entry)var7.next(); sb.append(" \n"); } sb.append("
"); url = (String)relyingPartyUrlToName.getKey(); sb.append(""); partyName = HtmlUtils.htmlEscape((String)relyingPartyUrlToName.getValue()); sb.append(partyName); sb.append(""); sb.append("
\n"); } sb.append("
\n"); sb.append(""); return sb.toString(); }