스프링 부팅에서 여러 DispatcherServlet 구성 상세 정보

springboot은 상자를 열면 사용할 디스패치 서브렛을 자동으로 설정합니다. 맵 경로는'/'입니다. 그러나 프로젝트에 여러 개의 서비스가 있으면 서로 다른 서비스에 대해 서로 다른 설정 관리를 하기 위해 서로 다른 서비스에 대해 서로 다른 상하문을 설정해야 합니다. 예를 들어distatcher Servlet을 열면rest 서비스에 전문적으로 사용됩니다.
기존 springMVC 프로젝트
전통적인springMVC 프로젝트에서 여러 개의 Dispatcher Servlet을 설정하면 웹에서 쉽게 사용할 수 있습니다.xml에서 여러 개를 직접 설정하면 됩니다.

  <servlet>
    <servlet-name>restServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring2.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ModelRestServlet</servlet-name>
    <url-pattern>/service/*</url-pattern>
  </servlet-mapping>
init-param의 contextConfigLocation을 지정하면 이 Dispatcher Servlet에 상하문을 지정할 수 있습니다.
spring boot에 Servlet을 등록하는 두 가지 방법
그러나springboot은tomcat을 모두 숨겼고, 웹은커녕.xml입니다.자, 다른 방식으로 servlet을 설정할 수 있습니다.
1. @WebServlet 메모:
이것은javaee의 주석입니다. servlet 3.0 이후에 제공됩니다.springboot은 이 주석을 스캔하고 이 주석의 클래스를 웹 용기에 servlet으로 등록합니다.
그러나 Dispatcher Servlet은 사용자 정의 servlet이 아니라 프레임워크가 제공하는 servlet이기 때문에 이 방법은 안 됩니다.
2.ServletRegistrationBean:
이 bean은springboot에서 servlet을 등록하는 것을 제공합니다. bean을 등록하는 것처럼 servlet을 설정할 수 있습니다.
 

  @Bean
  public ServletRegistrationBean restServlet(){
    // 
    AnnotationConfigWebApplicationContext applicationContext
        = new AnnotationConfigWebApplicationContext();
    //base package
    applicationContext.scan("com.jerryl.rest");
    // dispatcherServlet 
    DispatcherServlet rest_dispatcherServlet
        = new DispatcherServlet(applicationContext);

    // ServletRegistrationBean servlet
    ServletRegistrationBean registrationBean
        = new ServletRegistrationBean(rest_dispatcherServlet);
    registrationBean.setLoadOnStartup(1);
    // urlmapping
    registrationBean.addUrlMappings("/rest/*");
    // name, dispatcherServlet
    registrationBean.setName("rest");
    return registrationBean;
  }

그중에서 주의해야 할 것은registration이다.setName("rest"), 이 문장은 매우 중요합니다. 왜냐하면name가 같은 Servlet Registration Bean은 하나만 효력이 발생하기 때문입니다. 즉, 나중에 등록한 것이name가 같은 Servlet Registration Bean을 덮어씁니다.
지정하지 않으면 기본값은 "dispatcher Servlet"이고 spring boot에서 제공하는 Dispatcher Servlet의name은 "dispatcher Servlet"입니다.spring boot의 DispatcherServletAutoConfiguration 클래스에서 다음을 확인할 수 있습니다.

    public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
      ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet, new String[]{this.serverProperties.getServletMapping()});
      registration.setName("dispatcherServlet");
      registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
      if(this.multipartConfig != null) {
        registration.setMultipartConfig(this.multipartConfig);
      }

      return registration;
    }
  }
따라서 기본 dispatcher Servlet을 덮어쓰지 않으려면 개별 이름을 지정해야 합니다.
또한 사용자 정의 Dispathcer Servlet이 연결된 설정 클래스에서 스캔을 설정하려면 @Enable WebMvc 주석을 추가해야 합니다. 그렇지 않으면 @Contrller 주석을 스캔하지 않습니다.
package com.jerryl.rest;

@Configuration
@ComponentScan("org.activiti.rest.service.api")
@EnableWebMvc
public class Cfg_Rest {
・・・
}
rest 서비스 정적 리소스에 대한 DispatcherServlet 액세스 차단
마지막으로 작은 문제가 하나 더 있습니다. 추가적으로 설정된 Dispatcher Servlet은 rest 서비스를 제공하는 데 사용되고 싶지만, 이렇게 설정한 후에localhost/rest/에 접근할 때 페이지 등 정적 자원에 접근할 수 있기 때문에 이상합니다.
스프링부트는 기본적으로 정적 자원에 대해 비추지만, 정적 자원에 접근하지 않으려면 이 비추기를 수정할 수 있습니다.
두 가지 방법:
1. 응용 프로그램에서.yml에서 구성:
spring:

 mvc:
  # /**
  static-path-pattern: /**
 resources:
  # classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ 。 , 。
  static-locations:
여기에 설정하면springboot 프로젝트 전체에 영향을 줍니다.그러나 기본 Dispatcher Servlet은 정적 리소스에 액세스해야 하므로 여기서 구성할 수 없습니다.
2. WebMvcConfigurerAdapter의 자바 클래스 구성을 상속합니다.

@Configuration
@EnableWebMvc
public class Cfg_View extends WebMvcConfigurerAdapter{
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**");
  }
}
addResourceHandlers 다시 쓰기 방법은resourceHandler만 지정하고resourceLocation은 지정하지 않습니다. 이렇게 하면 정적 자원에 대한 모든 접근을 차단하고 정적 자원을 되돌려 주지 않습니다.이 설정은 지정할 수 있습니다. rest 서비스를 담당하는 Dispatcher Servlet의 상하문에서 이 설정 클래스를 스캔하면 됩니다.기본 DispatcherServlet에는 영향을 주지 않습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기