我是spring框架的新手。我正在为我的Web应用程序创建一个登录页面,我希望用户在对该应用程序执行任何操作之前先登录。如果用户输入好的凭据,一切正常,但如果输入的凭据不好,我想显示一条消息,并将用户名保留在输入元素上。显示消息不是问题,但是如果不使用不赞成使用的变量SPRING_SECURITY_LAST_USERNAME,则无法将用户名保留在jps文件中。
希望有人可以帮助我,我正在使用Spring 3。
更新:要求说我不想在URL上显示用户名。
不推荐使用的常量的文档准确地告诉您应该做什么:
/** * @deprecated If you want to retain the username, cache it in a customized {@code AuthenticationFailureHandler} */ @Deprecated public static final String SPRING_SECURITY_LAST_USERNAME_KEY = "SPRING_SECURITY_LAST_USERNAME";
像这样:
public class UserNameCachingAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { public static final String LAST_USERNAME_KEY = "LAST_USERNAME"; @Autowired private UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter; @Override public void onAuthenticationFailure( HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { super.onAuthenticationFailure(request, response, exception); String usernameParameter = usernamePasswordAuthenticationFilter.getUsernameParameter(); String lastUserName = request.getParameter(usernameParameter); HttpSession session = request.getSession(false); if (session != null || isAllowSessionCreation()) { request.getSession().setAttribute(LAST_USERNAME_KEY, lastUserName); } } }
在您的安全配置中:
<security:http ...> ... <security:form-login authentication-failure-handler-ref="userNameCachingAuthenticationFailureHandler" ... /> </security:http> <bean id="userNameCachingAuthenticationFailureHandler" class="so.UserNameCachingAuthenticationFailureHandler"> <property name="defaultFailureUrl" value="/url/to/login?error=true"/> </bean>
在您的login.jsp中:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page session="true" %> ... <%--in the login form definition--%> <input id="j_username" name="j_username" type="text" value="<c:out value="${sessionScope.LAST_USERNAME}"/>"/>