복붙노트

[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. ==============================

    1.Spring에서만이 작업을 원한다면 가능하지만 약간 지저분하다.

    Spring에서만이 작업을 원한다면 가능하지만 약간 지저분하다.

    모든 작업이 완료되면 컨트롤러에 매핑 할 수없는 요청은 모두 HttpRequestHandler로 전달되어 "있는 그대로"제공됩니다.

  2. ==============================

    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. ==============================

    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. ==============================

    4.나를위한 가장 간단한 방법 (Spring의 최신 버전을 사용하는 경우)

    나를위한 가장 간단한 방법 (Spring의 최신 버전을 사용하는 경우)

    <mvc:resources mapping="/**/*.js" location="/"/>
    <mvc:resources mapping="/**/*.css" location="/"/>
    ...
    
  5. ==============================

    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. ==============================

    6.정적 이미지를 제공하기 위해 무엇을 사용하고 있습니까? Apache라면 css / js 요청을 앱 서버에 전달하지 않도록 Apache를 구성 할 수 있습니다.

    정적 이미지를 제공하기 위해 무엇을 사용하고 있습니까? Apache라면 css / js 요청을 앱 서버에 전달하지 않도록 Apache를 구성 할 수 있습니다.

    Tomcat을 사용한다면 httpd.conf에 다음과 같이 입력하십시오 :

    JkUnMount /*.css  webapp
    

    여기서 'webapp'는 workers.properties의 항목입니다.

    미안해, 순수한 Spring 솔루션을 제공 할 수는 없지만, 어떻게해야할까요?

  7. ==============================

    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. ==============================

    8.Spring 디스패처에 의해 처리되기를 바라는 요청에 대해 일관된 확장 기능을 가지고 있습니까 (대부분의 Spring 예제는 * .htm을 사용합니다). 이 경우 처리 할 확장 프로그램에 매핑하여 css 및 js 파일을 무시할 수 있습니다.

    Spring 디스패처에 의해 처리되기를 바라는 요청에 대해 일관된 확장 기능을 가지고 있습니까 (대부분의 Spring 예제는 * .htm을 사용합니다). 이 경우 처리 할 확장 프로그램에 매핑하여 css 및 js 파일을 무시할 수 있습니다.

    그렇지 않으면 Nalandial과 동의 할 것입니다. 필터 접근 방식은 아마도이 시점에서 가장 좋은 방법 일 것입니다.

  9. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    12.일반적으로 큰 웹 사이트는 정적 콘텐트를 처리하기 위해서만 다른 서버를 사용하는 것을 선호합니다. 정적 컨텐츠 요청은 하나의 서버로 이동하고 동적은 다른 서버로 이동합니다 (이 경우 봄).

    일반적으로 큰 웹 사이트는 정적 콘텐트를 처리하기 위해서만 다른 서버를 사용하는 것을 선호합니다. 정적 컨텐츠 요청은 하나의 서버로 이동하고 동적은 다른 서버로 이동합니다 (이 경우 봄).

    많은 경우 Nginx 서버 (http://nginx.com/)는 최근의 매우 빠른 서버입니다.

    그러나 이것은 할 사소한 일이 아닙니다. 많은 구성.

  13. ==============================

    13.내 경우 엔 다 괜찮 았어. 하지만 컨트롤러에 문제가 있습니다.

    내 경우 엔 다 괜찮 았어. 하지만 컨트롤러에 문제가 있습니다.

    내 문제 였어.     @RequestMapping (method = RequestMethod.GET)

    이것을 위해 y 변경 :

    @RequestMapping(value = "/usuario", method = RequestMethod.GET)
    

    작동하고

    @RequestMappgin이 나쁜 컨트롤러를 찾아 변경하십시오.

  14. 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