복붙노트

[SPRING] 적절한 mvc : Spring의 인터셉터 설정

SPRING

적절한 mvc : Spring의 인터셉터 설정

나는 종류의 문제가있다. 이 인터셉터에서 각 요청 postHandle 메서드를 호출해야합니다.

public class DiMenuInterceptor extends HandlerInterceptorAdapter {

   @Autowired
   private IDiCategoryService categoryService;


   @Override
   public void postHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {

       modelAndView.addObject("category", categoryService.getCategoryInTree());
   }
}

그래서 나는이 라인을 서블릿 구성에 넣었고 모든 것이 잘 동작한다.

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:interceptors-ref="menuInterceptor" />

<bean id="menuInterceptor" class="cz.cosi.DiMenuInterceptor" />

하지만 이제 구성을 변경하고

PostHandle 메서드는 요청 당 한 번 이상 호출되므로이 구성에서는 postHandle 메서드에서 modelAndView에 대한 일련의 null 포인터 예외가 발생합니다.

 <mvc:interceptors>
    <bean class="cz.cosi.DiMenuInterceptor" />
 </mvc:interceptors>

이 구성을 사용하면 요청 서버의 Address / anything에 대해서만 작동합니다. 요청 serverAddress / anything / something은 postHandle이 호출되지 않습니다.

<mvc:interceptors>
   <mvc:interceptor>
     <mvc:mapping path="/*" />
     <bean class="cz.cosi.DiMenuInterceptor" />
   </mvc:interceptor>
</mvc:interceptors>

서블릿 구성의 일부

<mvc:annotation-driven />

<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8" />       

</bean>

<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/js/**" location="/js/" />

<mvc:interceptors>
    <bean class="cz.cosi.DiMenuInterceptor" />
</mvc:interceptors>

<tx:jta-transaction-manager />

<tx:annotation-driven />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

예외가 제대로로드 된 이미지, 스타일 및 자바 스크립트가 아니기 때문에 문제는 어떻게 든 리소스와 관련 될 수 있습니다. mvc가 없다면 : 리소스가 올바르게 작동하지만 이것은 해결책이 아닙니다.

내 질문은 를 사용하여 DiMenuInterceptor를 올바르게 구성하는 방법입니다. 충고에 감사드립니다.

스택:

2011-04-14 09:56:02,487 [http-8080-3] DEBUG (FilterChainProxy.java:195) ? Converted URL to lowercase, from: '/images/core/users/super_admin.png'; to: '/images/core/users/super_admin.png'
2011-04-14 09:56:02,533 [http-8080-3] DEBUG (FilterChainProxy.java:202) ? Candidate is: '/images/core/users/super_admin.png'; pattern is /images/**; matched=true
2011-04-14 09:56:02,533 [http-8080-3] DEBUG (FilterChainProxy.java:158) ? /images/core/users/super_admin.png has an empty filter list
14.4.2011 9:56:02 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet spring threw exception
java.lang.NullPointerException
    at cz.cosi.DiMenuInterceptor.postHandle(DiMenuInterceptor.java:41)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:801)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:163)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:595)

어쩌면 해결책을 찾았을 지 모르지만 확실히 최선은 아닙니다. 지금은 그것이 작동하고있는 것 같습니다.

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/*" />
        <bean class="cz.cosi.DiMenuInterceptor" />
    </mvc:interceptor>
    <mvc:interceptor>
         <mvc:mapping path="/search/**" />
        <bean class="cz.cosi.DiMenuInterceptor" />
    </mvc:interceptor>

    <mvc:interceptor>
         <mvc:mapping path="/context/**" />
        <bean class="cz.cosi.DiMenuInterceptor" />
    </mvc:interceptor>
    <mvc:interceptor>
          <mvc:mapping path="/member/**" />
        <bean class="cz.cosi.DiMenuInterceptor" />
    </mvc:interceptor>

</mvc:interceptors>

해결법

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

    1.경로에 하위 경로가 포함되도록 지정해야합니다. / ** "대신 / *.

    경로에 하위 경로가 포함되도록 지정해야합니다. / ** "대신 / *.

    <mvc:interceptors>
       <mvc:interceptor>
         <mvc:mapping path="/**" />
         <bean class="cz.cosi.DiMenuInterceptor" />
       </mvc:interceptor>
    </mvc:interceptors>
    

    Spring 레퍼런스의 @see 예제, 15.12.2 절 mvc : 인터셉터

  2. ==============================

    2.문제는 리소스가 요청 될 때 인터셉터가 호출된다는 것입니다.

    문제는 리소스가 요청 될 때 인터셉터가 호출된다는 것입니다.

    이 글에서는 xml 구성을 사용하여 인터셉터가 호출되지 않도록하는 방법에 대해 설명합니다. 허용 된 대답에서 나는 경로의 의미 론적 구성에 의존하는 큰 팬이 아니다 (즉, .html를 사용하거나 경로에 페이지가 있음). 이제 팀의 모든 개발자는 컨트롤러를 만들 때이를 인식해야합니다.

    필자도 장황한 bean 구성을 좋아하지 않기 때문에 다음 코드를 인터셉터에 추가하기로 결정했습니다.

    if (ClassUtils.isAssignableValue(ResourceHttpRequestHandler.class, handler)) {
        return;
    }
    
    // do interceptor logic here...
    
  3. ==============================

    3.인터프리터는 'glyphicons-halflings-regular.woff'또는 'glyphicons-halflings-regular.ttf'와 같은 글꼴 리소스를 차단했으며 첫 페이지에는 표시되지 않았습니다. 나는 다음과 같은 방식으로 내 문제를 해결한다. 내 인터셉터의 정의는 다음과 같습니다.

    인터프리터는 'glyphicons-halflings-regular.woff'또는 'glyphicons-halflings-regular.ttf'와 같은 글꼴 리소스를 차단했으며 첫 페이지에는 표시되지 않았습니다. 나는 다음과 같은 방식으로 내 문제를 해결한다. 내 인터셉터의 정의는 다음과 같습니다.

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cz.cosi.DiMenuInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    

    그리고 DiMenuInterceptor 클래스 :

    public class DiMenuInterceptor extends HandlerInterceptorAdapter {
    
    private List<String> nonAuthPaths;
    
    public DiMenuInterceptor() {
        nonAuthPaths = new ArrayList<String>();
        nonAuthPaths.add("/login");
        nonAuthPaths.add("/resources/vendor/fonts/glyphicons-halflings-regular.woff");
        nonAuthPaths.add("/resources/vendor/fonts/glyphicons-halflings-regular.ttf");
    }
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
        Object user = request.getSession().getAttribute(SessionManagement.USER_KEY);
    
        if (user == null && !nonAuthPaths.contains(request.getServletPath())) {
                response.sendRedirect(request.getContextPath() + "/login");
            }
            return false;
        } else {
            //ect ...
            return true;
        }
    }
    
  4. ==============================

    4.나도 같은 질문을했다. 초기 구성 :

    나도 같은 질문을했다. 초기 구성 :

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/*"/>
            <bean class="cn.mmd.micro.common.TokenInterceptor">
                <property name="excludeUrls">
                    <list>
                        <value>/app/token</value>
                    </list>
                </property>
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>
    

    나는 값 "mvc : mapping"을 변경했고, 효과가 있었다. 새로운 구성은 다음과 같습니다.

    <mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="cn.mmd.micro.common.TokenInterceptor">
            <property name="excludeUrls">
                <list>
                    <value>/app/token</value>
                </list>
            </property>
        </bean>
    </mvc:interceptor>
    

  5. from https://stackoverflow.com/questions/5656124/proper-mvcinterceptor-configuration-in-spring by cc-by-sa and MIT license