programing

스프링 부트:favicon 덮어쓰기

luckcodes 2023. 2. 11. 23:44

스프링 부트:favicon 덮어쓰기

Spring Boot의 favicon을 덮어쓰려면 어떻게 해야 하나요?

메모: 코딩이 필요 없는 다른 솔루션을 제공하는 또 다른 질문이 있습니다.Spring Boot : fat jar를 사용하여 임의의 디렉토리에서 외부 application.properties 파일을 사용할 수 있습니까?application.properties용이지만 favicon에도 적용이 가능합니다.사실, 나는 지금 그 방법을 favicon 오버라이딩에 사용하고 있다.

@EnableWebMvc가 있는 클래스를 구현하면 Spring Boot의 WebMvcAutoConfiguration 클래스가 로드되지 않고 정적 콘텐츠의 루트 디렉토리에 배치하여 자신의 favicon을 제공할 수 있습니다.

그렇지 않으면 WebMvcAutoConfiguration은 faviconRequestHandler bean을 등록합니다(소스 https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java) 참조).Spring Boot의 메인리소스 디렉토에 배치되어 있는 '그린 리프' 아이콘을 제공합니다.ry.

직접 @EnableWebMvc를 가진 클래스를 구현하지 않고 Spring Boot의 WebMvcAutoConfiguration 클래스의 기본 설정 기능을 모두 비활성화하지 않고 덮어쓰려면 어떻게 해야 합니까?

또, 클라이언트측(웹 브라우저측)에서 아이콘 파일을 가능한 한 빨리 갱신하고 싶기 때문에, favicon 파일의 캐시 기간을 0으로 설정해 주세요(다음 코드와 같이, 파일 변경 후, 가능한 한 빨리 클라이언트측에서 갱신할 필요가 있는 「스태틱」웹 앱 컨텐츠나 스크립트 파일에 사용하고 있습니다).

public void addResourceHandlers(ResourceHandlerRegistry registry)
{
    registry.addResourceHandler("/**")
        .addResourceLocations("/")
        .setCachePeriod(0);
}

따라서 Spring Boot의 faviconRequestHandler가 지정한 favicon.ico 파일을 저장할 장소를 찾는 것만으로는 충분하지 않을 수 있습니다.

갱신하다

src/main/favicon favicon iconiconc 。그러나 캐시 기간의 문제는 아직 남아 있습니다.
있는 .

갱신하다

좋아, 난 기본을 무시했어.제가 한 일은 다음과 같습니다.

@Configuration
public class WebMvcConfiguration
{
    @Bean
    public WebMvcConfigurerAdapter faviconWebMvcConfiguration()
    {
        return new FaviconWebMvcConfiguration();
    }

    public class FaviconWebMvcConfiguration extends WebMvcConfigurerAdapter
    {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry)
        {
            registry.setOrder(Integer.MIN_VALUE);
            registry.addResourceHandler("/favicon.ico")
                .addResourceLocations("/")
                .setCachePeriod(0);
        }
    }
}

기본적으로 registry.setOrder(Integer)를 호출하여 가장 높은 순서의 자원 핸들러를 추가함으로써 기본 핸들러를 덮어씁니다.MIN_VALUE).

Spring Boot 디폴트에는 순서값(Integer)이 있기 때문에MIN_VALUE + 1) (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java)의 Favicon Configuration 클래스를 참조해 주세요.핸들러가 이깁니다.

이거 괜찮아요?다른 방법이 있을까요?

갱신하다

괜찮지 않아요.가 전화했을 때registry.setOrder(Integer.MIN_VALUE)모든 자원 핸들러의 우선순위를 높입니다. 다음 코드에 WebMvcConfigurerAdapter사실상 모든 http 요구가 해당 자원 핸들러로 전송되므로 Java 코드에 의한 동적 처리가 방지됩니다.

public void addResourceHandlers(ResourceHandlerRegistry registry)
{
    registry.addResourceHandler("/**")
        .addResourceLocations("/")
        .setCachePeriod(0);
}

다른 해결책이 필요합니다.

갱신하다

【스프링 부츠】【파비콘】【파비콘】【파비콘】【파비콘】
나만의 거예요.HandlerMapping요.

이제 다음 옵션 중 하나를 선택할 수 있습니다.

  1. 을 받다@EnableWebMvc Boot 를 로 합니다.WebMvcAutoConfiguration (클래스 할 수 .) (미국의)WebMvcAutoConfiguration class favicon favicon 능 class class 。
  2. Spring Boot의 favicon 기능에 따라 favicon 파일을 임의의 위치에 배치할 수 없습니다.캐싱 문제는 무시하십시오.

하다
favicon 파일을 정적 웹 파일(문서 루트를 변경할 수 있으므로 임의의 디렉토리)과 함께 배치하여 캐싱 문제를 해결하고 싶습니다.
가가뭘 ?놓 ???
어떤 제안이라도 해주시면 감사하겠습니다.

갱신하다

참고로 favicon 및 기타 정적 파일의 위치를 변경하고자 하는 이유는 다음과 같습니다.을 사용법

한 페이지 웹 애플리케이션(SPA)을 만들고 있습니다.

라이브러리/프레임워크:

  • 서버 측에서는 Spring을 사용합니다.(물론입니다)
  • 클라이언트(웹 브라우저) 측에서는 Angular를 사용합니다.JS.

도구:

  • 서버 측에서는 Spring Tool Suite를 사용합니다.
  • 클라이언트 측에서는 WebStorm을 사용하고 있습니다.

주 디렉터리 구조:

ProjectRoot\
    src\
    bin\
    build\
    webapp\
    build.gradle
  • src: Spring Java 소스 파일이 있는 위치.
  • bin: Spring Tool Suite가 빌드 출력을 저장하는 위치.
  • 빌드: 'gradle build'가 빌드 출력을 배치하는 위치.
  • webapp: 클라이언트의 소스 파일(.js, .css, .htm 및 favicon)이 저장되어 있는 장소.따라서 이것은 WebStorm 프로젝트 디렉토리입니다.(필요에 따라 디렉토리 이름을 변경할 수 있습니다.)

내가 원하는 것은:

  • Spring 서버 애플리케이션을 재구축/재기동하지 않고 클라이언트 코드를 수정 및 테스트할 수 있습니다.따라서 클라이언트 코드를 jar 파일에 넣으면 안 됩니다.어쨌든 Spring Tool Suite는 (최소한 현재 구성의 경우) jar 파일을 전혀 빌드하지 않습니다.
  • Spring 서버 애플리케이션을 클라이언트 코드로 테스트하여 Spring Tool Suite 출력과 그라들 출력을 쉽게 전환할 수 있도록 합니다.는, 「」의 양쪽의 할 수 있을 .build(실제로는 build\libs) 및 서버어플리케이션의 「」를 참조해 주세요bin디렉토리로 이동합니다.
  • 클라이언트 코드를 수정할 때 웹 브라우저에서 즉시 사용할 수 있어야 합니다.따라서 브라우저는 무기한 캐시를 해서는 안 되며 항상 서버에 업데이트를 요청해야 합니다.
  • 도입 시 서버 애플리케이션을 재구축/재기동하지 않고 클라이언트 코드를 변경할 수 있어야 합니다.따라서 클라이언트 코드를 jar 파일에 넣으면 안 됩니다.

캐시 문제에 대해서:

addResourceHandlers()에 setCachePeriod(0)가 없으면 Google Chrome은 서버에 업데이트를 요구하지 않고 파일을 무기한 캐시합니다.서버에도 접속하지 않습니다.(Google 엔지니어는 동작은 올바르다고 말합니다.)따라서 브라우저 캐시를 수동으로 클리어하는 것밖에 할 수 없습니다.개발 환경에서는 답답하고 실가동 환경에서는 받아들일 수 없습니다.

Node.js의 BTW, express.js 모듈은 Google Chrome이 서버에 업데이트를 요청하도록 적절한 기본 HTTP 헤더를 제공합니다.Spring과 express.js가 Fiddler를 사용하여 생성하는HTTP 헤더를 확인해보니 서로 달랐습니다.

환경을 개선하기 위한 어떤 제안이라도 해주시면 감사하겠습니다.
제가 봄 초보자라서 뭔가 놓치고 있는 것 같아요.

갱신하다

드디어 작동 코드가 생겼어요.다음과 같습니다.

@Configuration
public static class FaviconConfiguration
{
    @Bean
    public SimpleUrlHandlerMapping myFaviconHandlerMapping()
    {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        mapping.setOrder(Integer.MIN_VALUE);
        mapping.setUrlMap(Collections.singletonMap("/favicon.ico",
            myFaviconRequestHandler()));
        return mapping;
    }

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    protected ResourceHttpRequestHandler myFaviconRequestHandler()
    {
        ResourceHttpRequestHandler requestHandler =
            new ResourceHttpRequestHandler();
        requestHandler.setLocations(Arrays
            .<Resource> asList(applicationContext.getResource("/")));
        requestHandler.setCacheSeconds(0);
        return requestHandler;
    }
}

콩 이름을 주목해 주세요.'내'라고 하다
의 자동 한 것 , 이 콘텍스트는, 「어느 쪽이 좋다」, 「어느 쪽이 좋다」의 필요했습니다.org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration.addResourceLocations().

이제 캐싱 문제가 없는 favicon 핸들러가 생겼고, 원하는 위치에 favicon 파일을 저장할 수 있습니다.
감사해요.

이 중 어느 것도 나에게 필요하지 않았다.

생성된 JAR에 리소스를 번들할 수 있는데 기본 JAR보다 우선 순위가 높은 경우 기본값을 재정의하는 이유는 무엇입니까?

favicon.ico했습니다.src/main/resources, 「」를 카피합니다.favicon.ico줄서서 거기에 넣어라.됩니다.따라서 " " " " " " " " " " " JAR " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""favicon.ico스프링에서 제공한 것보다 먼저 발견됩니다.

상기의 조작을 실시하면, 상기의 갱신 솔루션과 같은 효과를 얻을 수 있습니다.

을 v1.2.0에 .src/main/resources/static.

favicon.ico)에 수 .classpath:/staticfavicon 할 수도 있습니다.spring.mvc.favicon.enabled=false.

또는 완전한 제어를 위해 HandlerMapping을 추가할 수 있습니다(Boot에서 HandlerMapping을 복사하여 priority를 높입니다).

@Configuration
public static class FaviconConfiguration {

@Bean
public SimpleUrlHandlerMapping faviconHandlerMapping() {
    SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
    mapping.setOrder(Integer.MIN_VALUE);
    mapping.setUrlMap(Collections.singletonMap("mylocation/favicon.ico",
            faviconRequestHandler()));
    return mapping;
}

@Bean
protected ResourceHttpRequestHandler faviconRequestHandler() {
    ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
    requestHandler.setLocations(Arrays
            .<Resource> asList(new ClassPathResource("/")));
    return requestHandler;
}
}

Springboot은 전체적으로 스마트한 솔루션으로 가득 차 있기 때문에 매우 좋지만, Favicon을 제공하기 위해 어플리케이션 bean을 등록하는 것은 매우 어리석기 때문에 거절합니다.

그냥 내 html 페이지 헤드에 내 favicon 링크를 이렇게 추가했어.

<link rel="icon" type="image/png" href="images/fav.png">

그리고 나는 내 favicon의 이름을 바꾸고 그것을 에 배치했다.

<ProjFolder>/src/main/resources/static/images/fav.png

이제 Spring과 Java를 사용하지 않고도 Chrome과 Firefox 브라우저 탭과 Safari 주소 표시줄에 아이콘이 표시되므로 이러한 사소한 기능을 위해 새로운 버전의 Springboot로 변경할 필요가 없습니다.

.21.1 Spring Boot 1.2.2, 1.1.11을 사용하면 기본 할 수 .spring.mvc.favicon.enabled = false★★★★★★★★★★★★★★★★★★.

상세한 것에 대하여는, 다음의 Web 사이트를 참조하십시오.

더 .spring.mvc.favicon.enabledxSpring Boot 2.2.x x x x

Boot의 새로운 버전(1.2는 확실하지만 1.1.8도 가능)에서는 스태틱리소스에 favicon.ico를 넣을 수 있습니다.

많은 옵션/변수를 시도했지만 이것만 작동했습니다. (스프링 부트 2.2.7)

Favicon.ico 파일 및 로봇txt를 /displic/static에 넣다

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
  protected void configure(HttpSecurity http) throws Exception { 
    http
      .authorizeRequests()
        .antMatchers("/favicon.ico").permitAll()
        .antMatchers("/robots.txt").permitAll()
        .antMatchers("/").permitAll()
        .anyRequest().authenticated();
    }
}

그리고.

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler(
      "/favicon.ico",
      "/robots.txt")
      .addResourceLocations(
        "classpath:/static/");
  }
}

도움이 된다면, 마음에 들어 주세요;)

registry.addResourceHandler("/robots.txt").addResourceLocations("/");

registry.add Resource Handler("/favicon.ico").add Resource Locations("/");

robots.txt, favicon.ico 파일 위치: /src/main/filename

스프링 부츠 1.2.1을 사용했습니다.

Spring Boot 버전 2.5.2를 사용하고 있습니다.제 경우 favicon.ico 파일이 아니라 favicon용 jpg/png 파일이 필요했습니다.

favicon.jpg/favicon.png 파일을 클래스 경로의 리소스 폴더에 저장합니다.src/main/resources/favicon.png
또는 클래스 경로의 리소스 폴더에 있는 정적 폴더에 있습니다.
src/main/resources/static/favicon.png

리소스 폴더의 템플릿 폴더에 있는HTML 페이지에 - 를 입력합니다.
<link rel="icon" type="image/png" href="../favicon.png">
★★★★★★★★★★★★★★★★★」
<link rel="icon" type="image/png" href="../static/favicon.png">
각각 헤드태그 안쪽에 있습니다.

언급URL : https://stackoverflow.com/questions/20673230/spring-boot-overriding-favicon