主要是通用改写扩展authenticationProcessingFilter类来实现,当然还有开源框架JCaptcha来生成验证码
    - public class AuthenticationProcessingFilter implements Filter, InitializingBean, ApplicationEventPublisherAware {   
 
    - public static final String ACEGI_SAVED_REQUEST_KEY = "ACEGI_SAVED_REQUEST_KEY";   
 
    - public static final String ACEGI_SECURITY_LAST_EXCEPTION_KEY = "ACEGI_SECURITY_LAST_EXCEPTION";   
 
    -   
 
    - public static final String ACEGI_SECURITY_FORM_USERNAME_KEY = "j_username";   
 
    - public static final String ACEGI_SECURITY_FORM_PASSWORD_KEY = "j_password";   
 
    - public static final String ACEGI_SECURITY_LAST_USERNAME_KEY = "ACEGI_SECURITY_LAST_USERNAME";   
 
    -   
 
    - private ApplicationEventPublisher eventPublisher;   
 
    - private AuthenticationDetailsSource authenticationDetailsSource = new AuthenticationDetailsSourceImpl();   
 
    - private AuthenticationManager authenticationManager;   
 
    -   
 
    - private String authenticationFailureUrl;   
 
    - private String defaultTargetUrl;   
 
    - private String filterProcessesUrl = getDefaultFilterProcessesUrl();   
 
    - private boolean alwaysUseDefaultTargetUrl = false;   
 
    -   
 
    - private RememberMeServices rememberMeServices = new NullRememberMeServices();   
 
    - protected MessageSourceAccessor messages = AcegiMessageSource.getAccessor();   
 
    - private Properties exceptionMappings = new Properties();   
 
    - private boolean continueChainBeforeSuccessfulAuthentication = false;   
 
    - public boolean isContinueChainBeforeSuccessfulAuthentication() {   
 
    - return continueChainBeforeSuccessfulAuthentication;   
 
    - }   
 
    - public void setContinueChainBeforeSuccessfulAuthentication(   
 
    - boolean continueChainBeforeSuccessfulAuthentication) {   
 
    - this.continueChainBeforeSuccessfulAuthentication = continueChainBeforeSuccessfulAuthentication;   
 
    - }   
 
    - public String getDefaultFilterProcessesUrl() {   
 
    - return "/j_acegi_security_check";   
 
    - }   
 
    - public void destroy() {}   
 
    -   
 
    - public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {   
 
    - if (!(request instanceof HttpServletRequest)) {   
 
    - throw new ServletException("Can only process HttpServletRequest");   
 
    - }   
 
    - if (!(response instanceof HttpServletResponse)) {   
 
    - throw new ServletException("Can only process HttpServletResponse");   
 
    - }   
 
    - HttpServletRequest httpRequest = (HttpServletRequest) request;   
 
    - HttpServletResponse httpResponse = (HttpServletResponse) response;   
 
    -   
 
    - String username = obtainUsername(httpRequest);   
 
    - String password = obtainPassword(httpRequest);   
 
    - if (username == null) {   
 
    - username = "";   
 
    - }   
 
    - if (password == null) {   
 
    - password = "";   
 
    - }   
 
    - if (requiresAuthentication(httpRequest, httpResponse)) {   
 
    - Authentication authResult;   
 
    - try {   
 
    -   
 
    - if(!onPreAuthentication(httpRequest, httpResponse)){   
 
    - httpRequest.getSession().setAttribute(ACEGI_SECURITY_LAST_USERNAME_KEY,   
 
    - username);   
 
    - throw new AuthenticationCodeException("请输入正确的验证码!");   
 
    - }   
 
    -   
 
    - UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username,   
 
    - password);   
 
    - setDetails(httpRequest, authRequest);   
 
    - httpRequest.getSession().setAttribute(ACEGI_SECURITY_LAST_USERNAME_KEY,username);   
 
    - authResult = this.getAuthenticationManager().authenticate(authRequest);   
 
    -   
 
    - if (continueChainBeforeSuccessfulAuthentication) {   
 
    - filterChain.doFilter(httpRequest, httpResponse);   
 
    - }   
 
    -   
 
    - successfulAuthentication(httpRequest, httpResponse, authResult);   
 
    - String targetUrl = alwaysUseDefaultTargetUrl ? null : obtainFullRequestUrl(httpRequest);   
 
    - if (targetUrl == null) {   
 
    - targetUrl = getDefaultTargetUrl();   
 
    - }   
 
    - if (!targetUrl.startsWith("http://") && !targetUrl.startsWith("https://")) {   
 
    - targetUrl = httpRequest.getContextPath() + targetUrl;   
 
    - }   
 
    - httpResponse.sendRedirect(httpResponse.encodeRedirectURL(targetUrl));   
 
    - return ;   
 
    - } catch (AuthenticationException failed) {   
 
    -   
 
    - unsuccessfulAuthentication(httpRequest, httpResponse, failed);   
 
    - String failureUrl = exceptionMappings.getProperty(failed.getClass().getName(), authenticationFailureUrl);   
 
    - if (!failureUrl.startsWith("http://") && !failureUrl.startsWith("https://")) {   
 
    - failureUrl = httpRequest.getContextPath() + failureUrl;   
 
    - }   
 
    - httpResponse.sendRedirect(httpResponse.encodeRedirectURL(failureUrl));   
 
    - return;   
 
    - }   
 
    - }   
 
    -   
 
    - filterChain.doFilter(request, response);   
 
    - }   
 
    -   
 
    - public Authentication attemptAuthentication(HttpServletRequest request,HttpServletResponse response)   
 
    - throws AuthenticationException, IOException{   
 
    - String username = obtainUsername(request);   
 
    - String password = obtainPassword(request);   
 
    -   
 
    - if (username == null) {   
 
    - username = "";   
 
    - }   
 
    - if (password == null) {   
 
    - password = "";   
 
    - }   
 
    - UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username,   
 
    - password);   
 
    - setDetails(request, authRequest);   
 
    - request.getSession().setAttribute(ACEGI_SECURITY_LAST_USERNAME_KEY,   
 
    - username);   
 
    - return this.getAuthenticationManager().authenticate(authRequest);   
 
    - }   
 
    -   
 
    - protected void setDetails(HttpServletRequest request,   
 
    - UsernamePasswordAuthenticationToken authRequest) {   
 
    - authRequest.setDetails(new WebAuthenticationDetails(request));   
 
    - }   
 
    -   
 
    -   
 
    - protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) {   
 
    - String uri = request.getRequestURI();   
 
    - int pathParamIndex = uri.indexOf(';');   
 
    - if (pathParamIndex > 0) {   
 
    - uri = uri.substring(0, pathParamIndex);   
 
    - }   
 
    -   
 
    - return uri.endsWith(request.getContextPath() + filterProcessesUrl);   
 
    - }   
 
    -   
 
    -   
 
    - public void init(FilterConfig arg0) throws ServletException {}   
 
    -   
 
    - public void afterPropertiesSet() throws Exception {}   
 
    -   
 
    - public void setApplicationEventPublisher(ApplicationEventPublisher context) {   
 
    - this.eventPublisher = context;   
 
    - }   
 
    -   
 
    - public void setAuthenticationDetailsSource(AuthenticationDetailsSource authenticationDetailsSource) {   
 
    - Assert.notNull(authenticationDetailsSource, "AuthenticationDetailsSource required");   
 
    - this.authenticationDetailsSource = authenticationDetailsSource;   
 
    - }   
 
    -   
 
    -   
 
    -   
 
    - public boolean isAlwaysUseDefaultTargetUrl() {   
 
    - return alwaysUseDefaultTargetUrl;   
 
    - }   
 
    -   
 
    - public void setAlwaysUseDefaultTargetUrl(boolean alwaysUseDefaultTargetUrl) {   
 
    - this.alwaysUseDefaultTargetUrl = alwaysUseDefaultTargetUrl;   
 
    - }   
 
    -   
 
    - public String getAuthenticationFailureUrl() {   
 
    - return authenticationFailureUrl;   
 
    - }   
 
    -   
 
    - public void setAuthenticationFailureUrl(String authenticationFailureUrl) {   
 
    - this.authenticationFailureUrl = authenticationFailureUrl;   
 
    - }   
 
    -   
 
    - public String getDefaultTargetUrl() {   
 
    - return defaultTargetUrl;   
 
    - }   
 
    -   
 
    - public void setDefaultTargetUrl(String defaultTargetUrl) {   
 
    - this.defaultTargetUrl = defaultTargetUrl;   
 
    - }   
 
    -   
 
    - public String getFilterProcessesUrl() {   
 
    - return filterProcessesUrl;   
 
    - }   
 
    -   
 
    - public void setFilterProcessesUrl(String filterProcessesUrl) {   
 
    - this.filterProcessesUrl = filterProcessesUrl;   
 
    - }   
 
    -   
 
    - protected String obtainPassword(HttpServletRequest request) {   
 
    - String password=request.getParameter(ACEGI_SECURITY_FORM_PASSWORD_KEY);   
 
    - if(password!=null){   
 
    - return MD5.toMD5(request.getParameter(ACEGI_SECURITY_FORM_PASSWORD_KEY));   
 
    - }   
 
    - return password;   
 
    - }   
 
    -   
 
    -   
 
    - protected String obtainUsername(HttpServletRequest request) {   
 
    - return request.getParameter(ACEGI_SECURITY_FORM_USERNAME_KEY);   
 
    - }   
 
    -   
 
    -   
 
    - protected boolean onPreAuthentication(HttpServletRequest request, HttpServletResponse response)   
 
    - throws AuthenticationException, IOException {   
 
    - String randNum=request.getParameter("randNum");   
 
    - String rand=(String)request.getSession().getAttribute("rand");   
 
    - if(rand.equals(randNum)){   
 
    - return true;   
 
    - }   
 
    - return false;   
 
    - }   
 
    -   
 
    - protected void onSuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response,   
 
    - Authentication authResult) throws IOException {}   
 
    - protected void onUnsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response,   
 
    - AuthenticationException failed) throws IOException {}   
 
    -   
 
    - protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,   
 
    - Authentication authResult) throws IOException {   
 
    -   
 
    - SecurityContextHolder.getContext().setAuthentication(authResult);   
 
    - onSuccessfulAuthentication(request, response, authResult);   
 
    - rememberMeServices.loginSuccess(request, response, authResult);   
 
    -   
 
    - if (this.eventPublisher != null) {   
 
    - eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));   
 
    - }   
 
    - }   
 
    - protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response,   
 
    - AuthenticationException failed) throws IOException {   
 
    - SecurityContextHolder.getContext().setAuthentication(null);   
 
    -   
 
    - try {   
 
    - request.getSession().setAttribute(ACEGI_SECURITY_LAST_EXCEPTION_KEY, failed);   
 
    - } catch (Exception ignored) {}   
 
    - onUnsuccessfulAuthentication(request, response, failed);   
 
    - rememberMeServices.loginFail(request, response);   
 
    - }   
 
    - public static String obtainFullRequestUrl(HttpServletRequest request) {   
 
    - SavedRequest savedRequest = (SavedRequest) request.getSession()   
 
    - .getAttribute(ACEGI_SAVED_REQUEST_KEY);   
 
    - return (savedRequest == null) ? null : savedRequest.getFullRequestUrl();   
 
    - }   
 
    - public Properties getExceptionMappings() {   
 
    - return exceptionMappings;   
 
    - }   
 
    - public void setExceptionMappings(Properties exceptionMappings) {   
 
    - this.exceptionMappings = exceptionMappings;   
 
    - }   
 
    - public MessageSourceAccessor getMessages() {   
 
    - return messages;   
 
    - }   
 
    - public void setMessages(MessageSourceAccessor messages) {   
 
    - this.messages = messages;   
 
    - }   
 
    - public RememberMeServices getRememberMeServices() {   
 
    - return rememberMeServices;   
 
    - }   
 
    - public void setRememberMeServices(RememberMeServices rememberMeServices) {   
 
    - this.rememberMeServices = rememberMeServices;   
 
    - }   
 
    - public ApplicationEventPublisher getEventPublisher() {   
 
    - return eventPublisher;   
 
    - }   
 
    - public void setEventPublisher(ApplicationEventPublisher eventPublisher) {   
 
    - this.eventPublisher = eventPublisher;   
 
    - }   
 
    - public AuthenticationDetailsSource getAuthenticationDetailsSource() {   
 
    - return authenticationDetailsSource;   
 
    - }   
 
    - public AuthenticationManager getAuthenticationManager() {   
 
    - return authenticationManager;   
 
    - }   
 
    - public void setAuthenticationManager(AuthenticationManager authenticationManager) {   
 
    - this.authenticationManager = authenticationManager;   
 
    - }   
 
    - }