Các tài liệu của hằng số NỮA nói chính xác những gì bạn nên làm:
/**
* @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";
Something như thế này:
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);
}
}
}
Trong cấu hình bảo mật của bạn:
<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>
Trong đăng nhập của bạn .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}"/>"/>
Cảm ơn bạn rất nhiều! Nó hoạt động như cần thiết! – droidpl
Không sao cả. Lưu ý rằng có không gian để cải thiện tại một số điểm. Ví dụ. mã hóa cứng tên của thuộc tính phiên trong tệp .jsp không phải là thanh lịch. Lý tưởng nhất là nó nên tham chiếu đến hằng số được định nghĩa trong 'UserNameCachingAuthenticationFailureHandler'. (Tôi phải thừa nhận tôi không biết làm thế nào để đạt được điều này.) – zagyi
Tôi không biết điều này có thể đạt được! Nhưng bây giờ đó là tất cả những gì tôi cần, điều này không bảo mật đúng cách nhưng một mẹo nhỏ để làm cho cuộc sống của người dùng tốt hơn! Thật đáng kinh ngạc là tôi không thể tìm thấy một giải pháp đơn giản như thế này ở bất cứ đâu! ;) – droidpl