2015-01-25 1 views
3

인터넷에서는 거대한 스택 트레이스로 스프레이가 내 로그를 막지 못하도록 사이트의 루트에 내 favicon.ico를 넣어야한다고 말합니다. 특히 RESTful 스프레이 응용 프로그램과 관련하여 사이트 루트가 무엇을 의미하는지 알 수 없습니다.scala 스프레이 응용 프로그램에 대한 favicon 배치 위치 (즉, 사이트의 루트는 무엇입니까?)?

내 프로젝트가 ~/src/my-project에 있다고 가정하고 빌드 (sbt assembly)하고이 위치에서 실행하면 어디에 favicon.ico ?? ~/src/my-project 퍼팅을 시도했지만 stacktrace를 여전히 얻습니다.

NB : Google 웹 사이트의 실제 프런트 엔드가 아닌 브라우저에서 API에 직접 액세스하는 경우에만 예외가 throw됩니다.

+3

[경로 ("favicon.ico") {getFromResource ("favicon.ico")}] (http://spray.io/documentation/1.1-SNAPSHOT/)와 같은 해당 경로를 추가해야 할 수도 있습니다. 스프레이 라우팅/파일 및 리소스 지시문/getFromResource /) – dk14

+0

@ dk14 논리적으로 보입니다. 시도해 보겠습니다. 귀하의 의견은 대답이 될만한 가치가 있습니까? – samthebest

답변

7

현재 대부분의 브라우저는 사이트 루트에 favicon.ico을 자동으로 찾습니다. 따라서 고객은 GET /favicon.icohttp-requests을 처리해야합니다. 이 작업을 수행하는 가장 쉬운 방법은 사용하는 것입니다 spray-routinggetFromResource :

import spray.routing.SimpleRoutingApp 
import spray.http._ 
import MediaTypes._ 

object Main extends App with SimpleRoutingApp { 
    implicit val system = ActorSystem("my-system") 

    startServer(interface = "localhost", port = 8080) { 
    path("favicon.ico") { 
     getFromResource("favicon.ico", `image/x-icon`) // will look for the file inside your `resources` folder 
    } 
    } 
} 

이미 일부 처리 배우가 (그리고 spray-routing를 사용하지 않는) 경우, 당신이 뭔가를 반환, 당신의 배우 내부에 직접 GET /favicon.ico를 처리해야합니다 like :

def receive = { 
    case HttpRequest(GET, Uri.Path("/favicon.ico"), _, _, _) => 
     sender ! HttpResponse(entity = HttpEntity(`image/x-icon`, 
     HttpData(new File("favicon.ico")))) //will take it from a file in application folder, you may also pass any array of byte instead of File 
    ... 
} 

두 번째 옵션에 대한 자세한 내용은 another answer을 참조하십시오.

P. - 당신이 favicon.ico 파일을 귀찮게하고 싶지 않은 경우는 두 경우 모두 단지 StatusCodes.NotFound를 반환 할 수 있습니다

에 대한

  • sender ! HttpResponse(NotFound)
  • 을 라우팅.

    W3C's preferred method (링크를 웹 페이지에 넣음)은 브라우저의 검색 순서에 따라 달라지며 브라우저 간 호환성을 보장하지 않습니다 (siteData-36 참조). 대부분의 브라우저는 html 페이지가 없어도 사이트의 루트를 먼저 확인하는 것으로 보입니다.

    +1

    'favicon'과 같은 경로가 있어야합니다. –

    관련 문제