2012-11-07 5 views
2

captcha 확인 필터라는 또 다른 필터를 스프링 보안의 인증 필터와 함께 추가하려고합니다. 이 오류가 발생합니다. 내가 누락 된 것? 빈 초기화가 실패했습니다. 중첩 예외는 org.springframework.beans.ConversionNotSupportedException : 'java.util.LinkedHashMap'유형의 속성 값을 'filterChainMap'속성의 필수 유형 'java.util.Map'으로 변환하는 데 실패했습니다. 중첩 예외가 java.lang.IllegalStateException : [com.asu.edu.base.vo.CaptchaFilterVO] 유형의 값을 'filterChainMap [/ **] [3]'속성의 필수 유형 [javax.servlet.Filter]으로 변환 할 수 없습니다. : 일치 편집자 또는 전환 전략은스프링 보안 3.0에 사용자 정의 필터 추가하기

내 된 .java 파일을 찾을 수 없습니다

public class CaptchaFilterVO { 
    @Autowired 
    private ReCaptcha reCaptcha = null; 

    public void doFilterInternal(HttpServletRequest req, HttpServletResponse res, 
      FilterChain chain) throws IOException, ServletException {  
     String recaptcha_response = req.getParameter("recaptcha_response_field"); 
     String recaptcha_challenge = req.getParameter("recaptcha_challenge_field"); 
     String remoteAddress = req.getRemoteAddr(); 
     ReCaptchaResponse reCaptchaResponse = this.reCaptcha.checkAnswer(
       remoteAddress, recaptcha_challenge, recaptcha_response); 
     if (!reCaptchaResponse.isValid()) { 

      System.out.println("Captcha worong. Please try again.");   

     } 
     else 
     { 
      System.out.println("Captcha correct. No need to try again."); 
     } 
     chain.doFilter(req, res); 
    } 
} 

springsecurity.xml

 <http auto-config="true"> 
     <!-- intercept-url pattern="/welcome*" access="ROLE_DEPARTMENT_MGR,ROLE_REGULAR_EMP,ROLE_GUEST_USR,ROLE_CORPORATE_MGR" /> 
     <intercept-url pattern="/admin*" access="ROLE_ADMIN" /--> 
     <intercept-url pattern="/login" filters="none" /> 
     <intercept-url pattern="/resources*" filters="none" /> 
     <intercept-url pattern="/register" filters="none" /> 
     <intercept-url pattern="/logout" filters="none" /> 
     <intercept-url pattern="/loginfailed" filters="none" /> 
     <intercept-url pattern="/admin*" access="ROLE_ADMIN" /> 
     <intercept-url pattern="/Dashboard*" access="ROLE_DEPARTMENT_MGR,ROLE_REGULAR_EMP,ROLE_CORPORATE_MGR" /> 
     <intercept-url pattern="/*" access="IS_AUTHENTICATED_FULLY"/> 
     <form-login login-page="/login" default-target-url="/" 
      authentication-failure-url="/loginfailed" /> 
     <logout logout-success-url="/logout" /> 
     <custom-filter ref="captchaVerifierFilter" after="FORM_LOGIN_FILTER"/> 

</http>  
<beans:bean id="captchaVerifierFilter" class="com.asu.edu.base.vo.CaptchaFilterVO"/> 
<beans:bean id="springSecurityFilterChain" class="org.springframework.web.filter.DelegatingFilterProxy"/> 
<beans:bean id="myfilterChainProxy" class="org.springframework.security.web.FilterChainProxy"> 
    <filter-chain-map path-type="ant">  
     <filter-chain pattern="/*" filters="springSecurityFilterChain,captchaVerifierFilter"/> 
    </filter-chain-map> 
</beans:bean> 

편집 : 공용 클래스는 CaptchaFilterVO가 OncePerRequestFilter 지금 내가 가진 javax.servlet.Filter 구현 확장 extended OncePerReque stFilter 클래스하지만 이제 충돌이 발생했습니다. 제발 도와주세요. org.springframework.web.util.NestedServletException : 요청 처리에 실패했습니다. 중첩 예외는 org.springframework.beans.BeanInstantiationException : Bean 클래스를 인스턴스화 할 수 없습니다 [org.springframework.http.HttpRequest] : 지정된 클래스는 인터페이스입니다 org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:894) org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:778) javax.servlet.http.HttpServlet.service (HttpServlet.java:621) javax.servlet.http.HttpServlet.service (HttpServlet.java : 722) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:368) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke (FilterSecurityInterceptor.java:109) 조직. springframework.security.web.access.intercept.FilterSecurityInterce ptor.doFilter (FilterSecurityInterceptor.java:83) org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:380)

+0

는'빈 클래스 [org.springframework.http.HttpRequest] 인스턴스화 할 수 없습니다. 인터페이스를 인스턴스화 할 수 없으므로 허용되지 않습니다. 그것을 제거하십시오. –

+0

HttpRequest에 대한 빈을 작성하지 않았습니다. 나는 다음과 같은 클래스 타입의 bean만을 생성하고있다. 위의 코드에서 보듯이 CaptchaFilterVO는 클래스 – PhantomM

+0

이 예외가 throw 된시기에 대한 자세한 정보를 제공합니다. –

답변

1

메서드 이름 (doFilterInternal)은 org.springframework.web.filter.OncePerRequestFilter을 확장하려고 함을 나타냅니다.

추가 : 클래스의 이름 뒤에

extends OncePerRequestFilter 

.

OncePerRequestFilterjavax.servlet.Filter을 구현합니다. 지정된 클래스 당신은 아마 인터페이스의 콩을 만든 interface.`입니다 :

및 ...

Filter base class that guarantees to be just executed once per request, 
on any servlet container. It provides a doFilterInternal 
method with HttpServletRequest and HttpServletResponse arguments. 
+0

이제 프로그램이 컴파일되지만 충돌이 발생합니다. – PhantomM

+0

질문에 덧글을 달았습니다. –

1

귀하의 CaptchaFilterVO 필터는 javax.servlet.Filter를 구현해야합니다.

관련 문제