[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가 없다면 : 리소스가 올바르게 작동하지만 이것은 해결책이 아닙니다.
내 질문은
스택:
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.경로에 하위 경로가 포함되도록 지정해야합니다. / ** "대신 / *.
경로에 하위 경로가 포함되도록 지정해야합니다. / ** "대신 / *.
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="cz.cosi.DiMenuInterceptor" /> </mvc:interceptor> </mvc:interceptors>
Spring 레퍼런스의 @see 예제, 15.12.2 절 mvc : 인터셉터
-
==============================
2.문제는 리소스가 요청 될 때 인터셉터가 호출된다는 것입니다.
문제는 리소스가 요청 될 때 인터셉터가 호출된다는 것입니다.
이 글에서는 xml 구성을 사용하여 인터셉터가 호출되지 않도록하는 방법에 대해 설명합니다. 허용 된 대답에서 나는 경로의 의미 론적 구성에 의존하는 큰 팬이 아니다 (즉, .html를 사용하거나 경로에 페이지가 있음). 이제 팀의 모든 개발자는 컨트롤러를 만들 때이를 인식해야합니다.
필자도 장황한 bean 구성을 좋아하지 않기 때문에 다음 코드를 인터셉터에 추가하기로 결정했습니다.
if (ClassUtils.isAssignableValue(ResourceHttpRequestHandler.class, handler)) { return; } // do interceptor logic here...
-
==============================
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.나도 같은 질문을했다. 초기 구성 :
나도 같은 질문을했다. 초기 구성 :
<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>
from https://stackoverflow.com/questions/5656124/proper-mvcinterceptor-configuration-in-spring by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 저지 - 스프링 3 인스턴스화 봄 관리 빈 (null!) (0) | 2019.01.04 |
---|---|
[SPRING] Java 및 Spring 3.0을 사용하여 JMS 항목 (대기열 아님)에서 동시에 여러 메시지를 처리 할 수 있습니까? (0) | 2019.01.04 |
[SPRING] Spring 데이터 REST : 컨트롤러에서 리파지토리 메서드 재정의 (0) | 2019.01.04 |
[SPRING] URL 매핑 문제 - Spring 웹 MVC (0) | 2019.01.04 |
[SPRING] 스프링 데이터 - null 값을 가진 경우 매개 변수를 무시합니다. (0) | 2019.01.04 |