[SPRING] 모든 요청을 처리하지만 정적 컨텐츠 디렉토리를 제외하도록 SpringMVC를 구성 할 수 있습니까?
SPRING모든 요청을 처리하지만 정적 컨텐츠 디렉토리를 제외하도록 SpringMVC를 구성 할 수 있습니까?
스프링 애플리케이션을 모든 들어오는 요청 ( '/ *')을 처리하도록 매핑하면 정적 콘텐츠 요청은 404를 반환합니다. 예를 들어, "myhost.com/css/global.css"에 대한 요청은 스프링이 요청을 가로 채기 때문에 자원이 존재하더라도 404를 반환합니다.
대안은 SpringMVC를 하위 디렉토리 (예를 들어 '/ home /')에 매핑하는 것이지만이 경우 응용 프로그램 내의 모든 링크에서이 디렉토리를 전달해야합니다. SpringMVC를 '/'로 매핑하고 디렉토리 집합을 처리에서 제외시키는 방법이 있습니까?
내 현재 web.xml 구성은 다음과 같습니다.
<servlet>
<servlet-name>springApp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springApp</servlet-name>
<url-pattern>/home/*</url-pattern>
</servlet-mapping>
Idealy 매핑을 다음과 같이하고 싶습니다.
<servlet-mapping>
<servlet-name>springApp</servlet-name>
<url-pattern>/*</url-pattern>
<exclude>/css/*,/js/*</exclude>
</servlet-mapping>
이런 종류의 일이 가능합니까?
해결법
-
==============================
1.Spring에서만이 작업을 원한다면 가능하지만 약간 지저분하다.
Spring에서만이 작업을 원한다면 가능하지만 약간 지저분하다.
모든 작업이 완료되면 컨트롤러에 매핑 할 수없는 요청은 모두 HttpRequestHandler로 전달되어 "있는 그대로"제공됩니다.
-
==============================
2.참고 :이 답변은 Spring 3.0.4+에만 적용됩니다.
참고 :이 답변은 Spring 3.0.4+에만 적용됩니다.
(BTW,이 질문도 다루었습니다 : mvc : resources, 유효하지 않은 xsd로 정적 컨텐츠를 제공하는 Spring)
Spring Subversion 샘플 저장소에서 Spring mvc-showcase 프로젝트를 확인하자. 그것은 당신이 원하는 것을 정확하게 보여줍니다. 즉, DisapatcherServlet에 의해 처리되지 않는 정적 자원을 묘사 할 수 있습니다. /mvc-showcase/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml 파일을 참조하십시오. 다음은 JS, CSS 및 이미지가 app 컨텍스트 루트에있는 mvc에 매핑 된 MVC 네임 스페이스를 사용하여 이러한 제외 항목을 처리하는 방법입니다.
<!-- resources exclusions from servlet mapping --> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/images/**" location="/images/" /> <mvc:resources mapping="/js/**" location="/js/" />
-
==============================
3.나는 클라이언트에게 컨텐츠를 제공하는 '기본'서블릿을 통해 정적 컨텐츠를 제공함으로써 해결했습니다. 그래서 내 web.xml은 다음과 같습니다 :
나는 클라이언트에게 컨텐츠를 제공하는 '기본'서블릿을 통해 정적 컨텐츠를 제공함으로써 해결했습니다. 그래서 내 web.xml은 다음과 같습니다 :
<servlet> <servlet-name>MyApp</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyApp</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- The 'dynamic' content --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <!-- The 'static' content -->
희망이 도움이됩니다.
-
==============================
4.나를위한 가장 간단한 방법 (Spring의 최신 버전을 사용하는 경우)
나를위한 가장 간단한 방법 (Spring의 최신 버전을 사용하는 경우)
<mvc:resources mapping="/**/*.js" location="/"/> <mvc:resources mapping="/**/*.css" location="/"/> ...
-
==============================
5.이를 수행하는 한 가지 방법은 필터를 사용하는 것입니다. 사용자 정의 코드를 약간 작성해야하지만 나쁘지는 않습니다. 다음은 * .css 또는 * .js 파일을 Spring 서블릿에 전달하지 않으려는 경우의 예입니다.
이를 수행하는 한 가지 방법은 필터를 사용하는 것입니다. 사용자 정의 코드를 약간 작성해야하지만 나쁘지는 않습니다. 다음은 * .css 또는 * .js 파일을 Spring 서블릿에 전달하지 않으려는 경우의 예입니다.
веб.хмл :
<filter-mapping> <filter-name>fileTypeFilter</filter-name> <filter-class>foo.FileTypeFilter</filter-class> <url-pattern>/*</url-pattern> </filter-mapping>
자바 클래스 :
public class FileTypeFilter implements Filter { public void init(FilterConfig conf) { // init logic here } public void destroy() { // release resources here } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException { if(shouldExclude(req)) { chain.doFilter(req, res); //some logic so the request doesnt go to the servlet //maybe you could just forward //the request directly to the file getting accessed. not sure if that would work } //file should be passed to the servlet; you can do some logic here //if you want } private boolean shouldExclude(ServletRequest req) { if(req instanceof HttpServletRequest) { HttpServletRequest hreq = (HttpServletRequest) req; return (hreq.getRequestURI().endsWith(".css") || hreq.getRequestURI().endsWith(".js")); } return false; } }
나는 이것을 테스트하지 않았지만 그것이 효과가있을 것이라고 생각합니다.
편집 : 서블릿 사양 제외 기능이 없습니다. 나는 Spring 내에서 이것을 할 수있는 좋은 방법이 있다고 생각하지 않지만 본질적으로 당신의 게시물에서 같은 것을 달성합니다.
편집 2 : 필터링 된 내용을 쉽게 변경할 수 있기를 원하면 Spring을 사용하여 런타임에 필터에 무언가를 주입 할 수 있습니다.
편집 3 : 파일에 직접 전달하면 필터가 다시 작동하므로 무한 루프에 걸릴 수 있습니다. 필터를 사용하여이 작업을 수행하는 다른 방법이있을 수 있지만 정직하게 무엇인지 확신 할 수 없습니다.
-
==============================
6.정적 이미지를 제공하기 위해 무엇을 사용하고 있습니까? Apache라면 css / js 요청을 앱 서버에 전달하지 않도록 Apache를 구성 할 수 있습니다.
정적 이미지를 제공하기 위해 무엇을 사용하고 있습니까? Apache라면 css / js 요청을 앱 서버에 전달하지 않도록 Apache를 구성 할 수 있습니다.
Tomcat을 사용한다면 httpd.conf에 다음과 같이 입력하십시오 :
JkUnMount /*.css webapp
여기서 'webapp'는 workers.properties의 항목입니다.
미안해, 순수한 Spring 솔루션을 제공 할 수는 없지만, 어떻게해야할까요?
-
==============================
7.나는 똑같은 문제를 겪었고 여기 어떻게 해결 했는가?
나는 똑같은 문제를 겪었고 여기 어떻게 해결 했는가?
다음이 web.xml 파일에 추가되었습니다.
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> <url-pattern>*.css</url-pattern> <url-pattern>*.ico</url-pattern> <url-pattern>*.png</url-pattern> <url-pattern>*.jpg</url-pattern> <url-pattern>*.htc</url-pattern> <url-pattern>*.gif</url-pattern> <url-pattern>*.html</url-pattern> <url-pattern>*.htm</url-pattern> </servlet-mapping>
다음은 spring3 MVC 서블릿 bean 정의 파일 (web.xml에 contextConfigLocation으로 구성된 파일 인 applicationContext.xml)에 추가되었습니다.
<mvc:annotation-driven /> <mvc:default-servlet-handler />
-
==============================
8.Spring 디스패처에 의해 처리되기를 바라는 요청에 대해 일관된 확장 기능을 가지고 있습니까 (대부분의 Spring 예제는 * .htm을 사용합니다). 이 경우 처리 할 확장 프로그램에 매핑하여 css 및 js 파일을 무시할 수 있습니다.
Spring 디스패처에 의해 처리되기를 바라는 요청에 대해 일관된 확장 기능을 가지고 있습니까 (대부분의 Spring 예제는 * .htm을 사용합니다). 이 경우 처리 할 확장 프로그램에 매핑하여 css 및 js 파일을 무시할 수 있습니다.
그렇지 않으면 Nalandial과 동의 할 것입니다. 필터 접근 방식은 아마도이 시점에서 가장 좋은 방법 일 것입니다.
-
==============================
9.가상 URL 경로를 사용하여 필요한 리소스를 검색합니다. 일반적으로 나는 Spring MVC를 사용하기 때문에 / WEB-INF / views 폴더 아래에 javascript와 css를 가질 수 없다. 나는이 커스텀 서블릿을 가지고 / WEB-INF / views 폴더 내의 .js 및 .css 파일들에 대한 액세스만을 허용했다. 귀하의 경우 / css 폴더와 / js 폴더를 / resource와 같은 상위 폴더로 이동하면 내 솔루션이 적용될 것입니다.
가상 URL 경로를 사용하여 필요한 리소스를 검색합니다. 일반적으로 나는 Spring MVC를 사용하기 때문에 / WEB-INF / views 폴더 아래에 javascript와 css를 가질 수 없다. 나는이 커스텀 서블릿을 가지고 / WEB-INF / views 폴더 내의 .js 및 .css 파일들에 대한 액세스만을 허용했다. 귀하의 경우 / css 폴더와 / js 폴더를 / resource와 같은 상위 폴더로 이동하면 내 솔루션이 적용될 것입니다.
String url = "YOUR_RESOURCE_FOLDER"을 변경할 수 있습니다.
예를 들어 가상 경로는 http://www.mysite.com/resources/path/path/app.js와 같이 될 수 있습니다.
그러면 /WEB-INF/views/path/path/app.js에 매핑됩니다.
을 포함한다.
<servlet> <servlet-name>ResourceDispatcherServlet</servlet-name> <servlet-class>mywebapp.web.ResourceDispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ResourceDispatcherServlet</servlet-name> <url-pattern>/resource/*</url-pattern> </servlet-mapping>
서블릿
public class ResourceDispatcherServlet extends HttpServlet { public void init() throws ServletException { } public void doGet(HttpServletRequest req, HttpServletResponse rsp) throws ServletException, IOException { String servletPath = req.getServletPath(); // /resource String pathInfo = req.getPathInfo(); // /path/path/app.js String url = "/WEB-INF/views" + pathInfo; String lastPath = StringUtil.substringAfterLast(pathInfo, "/"); String extension = StringUtil.substringAfterLast(lastPath, "."); try { RequestDispatcher dispatcher = null; if (!StringUtil.isEmpty(extension) && ("js".equals(extension) || "css".equals(extension))) { dispatcher = req.getRequestDispatcher(url); } if (dispatcher != null) { dispatcher.include(req, rsp); } else { rsp.sendError(404); } } catch (Exception e) { if (!rsp.isCommitted()) { rsp.sendError(500); } } } }
-
==============================
10.Spring 3.0.4 이상을 사용한다면 atrain이 제공 한 솔루션을 사용해야한다.
Spring 3.0.4 이상을 사용한다면 atrain이 제공 한 솔루션을 사용해야한다.
그렇지 않으면이 간단한 작업을 수행 할 수 있습니다.
아마도 다음과 같이 정적 디렉토리 구조를 제공해야합니다.
WebContent | WEB-INF | public | css | js | img
Eclipse 동적 웹 프로젝트는 기본적으로 WebContent / WEB-INF 구조를 생성합니다. 공용 폴더를 WEB-INF 디렉토리에서 WebContentdirectory로 이동하십시오.
클라이언트 측
다음과 같은 방식으로 정적 파일을 참조하십시오.
<link rel="stylesheet" type="text/css" href="public/css/mystyles.css">
여기 내 참조입니다.
-
==============================
11.UrlRewriteFilter를 사용하여 요청을 서블릿으로 리디렉션하는 것이 더 깔끔합니다 (여기서는 urlrewrite.xml 예제).
UrlRewriteFilter를 사용하여 요청을 서블릿으로 리디렉션하는 것이 더 깔끔합니다 (여기서는 urlrewrite.xml 예제).
<urlrewrite> <rule> <from>^/img/(.*)$</from> <to>/img/$1</to> </rule> <rule> <from>^/js/(.*)$</from> <to>/js/$1</to> </rule> <rule> <from>^/css/(.*)$</from> <to>/css/$1</to> </rule> <rule> <from>^/(.*)$</from> <to>/app/$1</to> </rule> <outbound-rule> <from>/app/(.*)$</from> <to>/$1</to> </outbound-rule> </urlrewrite>
노트:
-
==============================
12.일반적으로 큰 웹 사이트는 정적 콘텐트를 처리하기 위해서만 다른 서버를 사용하는 것을 선호합니다. 정적 컨텐츠 요청은 하나의 서버로 이동하고 동적은 다른 서버로 이동합니다 (이 경우 봄).
일반적으로 큰 웹 사이트는 정적 콘텐트를 처리하기 위해서만 다른 서버를 사용하는 것을 선호합니다. 정적 컨텐츠 요청은 하나의 서버로 이동하고 동적은 다른 서버로 이동합니다 (이 경우 봄).
많은 경우 Nginx 서버 (http://nginx.com/)는 최근의 매우 빠른 서버입니다.
그러나 이것은 할 사소한 일이 아닙니다. 많은 구성.
-
==============================
13.내 경우 엔 다 괜찮 았어. 하지만 컨트롤러에 문제가 있습니다.
내 경우 엔 다 괜찮 았어. 하지만 컨트롤러에 문제가 있습니다.
내 문제 였어. @RequestMapping (method = RequestMethod.GET)
이것을 위해 y 변경 :
@RequestMapping(value = "/usuario", method = RequestMethod.GET)
작동하고
@RequestMappgin이 나쁜 컨트롤러를 찾아 변경하십시오.
from https://stackoverflow.com/questions/1234298/can-springmvc-be-configured-to-process-all-requests-but-exclude-static-content by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring과 Hibernate를 사용하여 여러 데이터베이스에서 분산 트랜잭션을 수행하는 '최선의'방법은 무엇입니까? (0) | 2018.12.09 |
---|---|
[SPRING] Spring 부팅 속성 파일에서 암호를 숨기는 방법 (0) | 2018.12.09 |
[SPRING] 특정 URL에 대해 봄 보안을 사용 중지하는 방법 (0) | 2018.12.09 |
[SPRING] http 요청 인터셉터를 추가하는 스프링 부트 (0) | 2018.12.09 |
[SPRING] 직렬화 관점에서 Spring 세션 범위 bean (컨트롤러)과 서비스에 대한 참조 (0) | 2018.12.09 |