복붙노트

[SPRING] 필터 콩 클래스에서 일부 콩을 사용하고 계십니까?

SPRING

필터 콩 클래스에서 일부 콩을 사용하고 계십니까?

필자의 필터 빈 클래스에서 (@Autowired 주석을 사용하여) 몇 가지 빈 의존성을 추가했다. 하지만 doFilter () 메서드에서 모든 종속성 빈은 null을가집니다 ...

public class FacebookOAuth implements Filter
{
@Autowired
private BusinessLogger logger;

@Autowired
private IUserSessionInfo userSessionInfo;

@Autowired
private FacebookOAuthHelper oAuthHelper;

public void init(FilterConfig fc) throws ServletException
{
    // Nothing to do
}

public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc) throws   IOException, ServletException
{
    // HttpServletRequest req = (HttpServletRequest)sr;
    HttpServletResponse res = (HttpServletResponse) sr1;

    String code = sr.getParameter("code");

    if (StringUtil.isNotBlankStr(code))
    {
        String authURL = this.oAuthHelper.getAuthURL(code);

this.oAuthHelper는 null (및 다른 의존성 bean)과 동일합니다 ...

당신이 나를 도울 수 ?

사실 나는 서버 측 (Spring)에서 MVC 개념을 사용하지 않는다. 내 사이드 ​​클라이언트는 Flex 기술을 사용하고 BlazeDS 서블릿 톤은 내 서버와 통신합니다.

그래서 이것이 필터 빈 개념을 사용합니다.

그럼, 어떻게 내 빈 콩에서 내 세션 콩 개념을 처리 할 수 ​​있습니까?

Skaffman,

귀하의 아이디어를 구현 했으므로 application.xml을 다음과 같이 업데이트합니다.

<bean id="FacebookOAuthHandler" class="com.xx.FacebookOAuthHandler" />
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
    <props>
       <prop key="/fbauth">FacebookOAuthHandler</prop>         
    </props>
   </property>
</bean>

내 페이스 북 OAuthHandler 클래스 :

public class FacebookOAuthHandler extends AbstractController
{
@Autowired
private BusinessLogger logger;

@Autowired
private IUserSessionInfo userSessionInfo;

@Autowired
private FacebookOAuthHelper oAuthHelper;

@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
        HttpServletResponse response) throws Exception {

    // TODO

    return null;
}

그러나 내 URL이 다음과 같은 경우 handleRequestInternal 메서드는 호출되지 않습니다. http : //xx.xx.xx.xx/MyApp/fbauth

해결법

  1. ==============================

    1.나는 똑같은 문제에 직면했다. 나의 첫 번째 아이디어는 Spring이 수동으로 여기에 제안 된 필터에 @Autowired 어노테이션을 적용하도록하는 것이었다.

    나는 똑같은 문제에 직면했다. 나의 첫 번째 아이디어는 Spring이 수동으로 여기에 제안 된 필터에 @Autowired 어노테이션을 적용하도록하는 것이었다.

    http://forum.springsource.org/showthread.php?60983-Autowiring-the-servlet-filter

    하지만 Java 클래스에서 bean 이름을 하드 코딩하는 아이디어를 좋아하지 않습니다.

    나는 잘 작동하는 더 깨끗한 방법을 발견했다 :

    public void init(FilterConfig filterConfig) throws ServletException {
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
                filterConfig.getServletContext());
    }
    
  2. ==============================

    2.이 필터가 web.xml에 있다고 가정하면 Spring에 의해 관리되지 않으므로 서블릿 컨테이너에서 관리하므로이 필터는 작동하지 않습니다. 따라서 자동 와이어 링과 같은 작업은 작동하지 않습니다.

    이 필터가 web.xml에 있다고 가정하면 Spring에 의해 관리되지 않으므로 서블릿 컨테이너에서 관리하므로이 필터는 작동하지 않습니다. 따라서 자동 와이어 링과 같은 작업은 작동하지 않습니다.

    Spring bean으로 서블릿 필터를 정의하려면 web.xml의 ContextLoaderListener를 사용하여 webapp의 루트 응용 프로그램 컨텍스트에서 정의한 다음 Spring 관리 Bean에 위임하는 DelegatingFilterProxy를 정의해야합니다. 작업.

    그러나 이것을 위해 서블릿 필터가 정말로 필요합니까? 내가 Facebook 인증 정보를 알고 있다면 Spring HandlerInterceptor를 사용하면 쉽게 할 수 있습니다. 위임 필터보다 구성 작업이 훨씬 적습니다.

  3. ==============================

    3.이 사이트의 봄철 답을보십시오 : http://forum.springsource.org/showthread.php?60983-Autowiring-the-servlet-filter

    이 사이트의 봄철 답을보십시오 : http://forum.springsource.org/showthread.php?60983-Autowiring-the-servlet-filter

    요약하면 스프링을 @Autowire 주석을 필터에 수동으로 적용하도록 강제 할 수 있습니다.

    public void init(FilterConfig filterConfig) throws ServletException {
    
        ServletContext servletContext = filterConfig.getServletContext();
        WebApplicationContext webApplicationContext = 
                WebApplicationContextUtils.getWebApplicationContext(servletContext);
    
        AutowireCapableBeanFactory autowireCapableBeanFactory =
               webApplicationContext.getAutowireCapableBeanFactory();
    
        autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
    }
    
  4. ==============================

    4.지금은 오래된 질문이지만, 현재 응답에는 DelegatingFilterProxy를 사용하는 예가 없으며, 최근 예제에서 이와 같은 예를 묻는 질문 하나가이 예제의 중복으로 표시되었습니다.

    지금은 오래된 질문이지만, 현재 응답에는 DelegatingFilterProxy를 사용하는 예가 없으며, 최근 예제에서 이와 같은 예를 묻는 질문 하나가이 예제의 중복으로 표시되었습니다.

    따라서 DelegatingFilterProxy는 루트 ApplicationContext를 알고 doFilter를 Bean에 위임하는 특수 필터입니다.

    예 : MyFilter는 Filter를 구현하는 클래스이고 myFilter는 봄 빈입니다.

    <bean id=myFilter class="org.example.MyFilter ...>...</bean>
    

    또는 구성 클래스에서

    @Bean
    public MyFilter myFilter() {
        MyFilter myFilter = new MyFilter();
        //initialization ...
        return myFilter;
    }
    

    web.xml에서 Bean과 동일한 이름을 가진 DelegatingFilterProxy를 선언하면됩니다.

    <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    이렇게하면 myBean은 참된 bean이므로 @Autowired 주석이있는 다른 bean과 함께 정상적으로 주입 될 수 있으며 doFilter 메소드는 DelegatingFilterProxy에 의해 호출됩니다. spring init과 destroy 메소드를 사용할 수 있기 때문에 "targetFilterLifecycle"필터 init-param을 "true"로 지정하지 않으면 기본적으로 init 및 destroy 메소드가 호출되지 않습니다.

  5. ==============================

    5.Autowiring을 사용하여 필터 클래스에서 서비스 클래스 Bean에 액세스하는 동안 null 포인터가 발생했습니다. 100 개 이상의 링크를 검색했지만 해결책을 찾을 수 없습니다. 나는 필터 클래스에서 빈을 얻는 데 필요한 스프링 부트 응용 프로그램 및 구성을 사용하고 있습니다.

    Autowiring을 사용하여 필터 클래스에서 서비스 클래스 Bean에 액세스하는 동안 null 포인터가 발생했습니다. 100 개 이상의 링크를 검색했지만 해결책을 찾을 수 없습니다. 나는 필터 클래스에서 빈을 얻는 데 필요한 스프링 부트 응용 프로그램 및 구성을 사용하고 있습니다.

    어플리케이션 컨텍스트 Object를 제공하는 FilterConfig.java.

    @Component
    public class FilterConfig  implements ApplicationContextAware{
    
    private static ApplicationContext context;
    
    
    public static ApplicationContext getApplicationContext() {
           return context;
        }
    public  static <T> T getBean(String name,Class<T> aClass){
        return context.getBean(name,aClass);
    }
    
    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        context = ctx;
    }   
    
     }
    

    Filter 클래스에서 다음과 같이 사용했습니다.

     UserService userService =FilterConfig.getBean("UserService", UserService.class);
    

    UserService 이것은 언급 된 bean 이름입니다.

      @Service("UserService")
      public class UserServiceImpl implements UserService { ...}
    

    스프링 부트의 기본 클래스에는 구성이 없습니다 : SpringBootServletInitializer

  6. from https://stackoverflow.com/questions/3645650/using-some-beans-in-filter-bean-class by cc-by-sa and MIT license