簡體   English   中英

如何在Spring MVC中禁用對JSP URL的處理?

[英]How to disable processing of JSP URLs in Spring MVC?

我有一個帶有各種方法的Spring MVC應用程序,例如

@RequestMapping(value="/SomeUrl/{filename:.+}", method=RequestMethod.GET)

在大多數情況下,這非常正常。 “。+”正則表達式意味着包含帶有擴展名的點字符的文件名也可以正常工作(如此處所述, Spring MVC @PathVariable被截斷

但是,如果請求是“ /SomeUrl/Something.jsp”,則該請求甚至都不會碰到我的方法,大概是因為Spring MVC內置了處理程序,該擴展程序注意到擴展名為.jsp,然后搜索了一個名為Something.jsp的實際文件。 。

我的應用程序確實具有JSP,但是都可以通過@RequestMapping方法或Servlet對其進行訪問,而JSP則永遠​​不能直接訪問。 那么如何禁用Spring MVC以.jsp擴展名執行任何特殊處理呢?

僅供參考,在我的web.xml中,我將所有內容通過管道傳遞到MVC調度程序中,如下所示:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

dispatcher-servlet.xml包含以下內容:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <!-- Turn off working out content type based on URL file extension, should fall back to looking at the Accept headers -->
    <property name="favorPathExtension" value="false" />
</bean>

<!-- This allows the static content (the CSS file) to be accessed still via the dispatcher -->
<mvc:resources mapping="/resources/**" location="/resources/" />

<context:component-scan base-package="com.myservicepackage" />

非常感謝您對此的任何建議!

將調度程序servlet映射到/與將其映射到/*並不完全相同。 使用/* ,您可以有效地要求servlet容器將所有請求都交給Spring MVC調度程序servlet。 使用/ ,可以將調度程序servlet設置為servlet容器的默認servlet,這是低優先級的catch all。

從Servlet規范3.0開始,第12章將請求映射到Servlet:

使用第一個成功的匹配,不嘗試其他匹配:

  1. 容器將嘗試查找請求路徑與Servlet路徑的精確匹配。 成功匹配將選擇servlet。
  2. 容器將遞歸地嘗試匹配最長的路徑前綴。 這是通過使用“ /”字符作為路徑分隔符,一次將路徑樹下移到一個目錄來完成的。 最長的匹配確定所選的servlet。
  3. 如果URL路徑中的最后一段包含擴展名(例如.jsp),則servlet容器將嘗試匹配處理該擴展名請求的servlet。 擴展名定義為最后一個段之后的最后一個段的一部分。 字符。
  4. 如果前三個規則均未導致servlet匹配,則容器將嘗試提供適合於所請求資源的內容。 如果為應用程序定義了“默認” servlet,則將使用它。 許多容器提供了隱式默認servlet來提供內容。

servlet映射的優先級降序為/* *.jsp/ Servlet容器通常具有*.jsp的隱式映射(來自相同的參考):

如果容器具有內部JSP容器,則將* .jsp擴展名映射到該容器,從而允許按需執行JSP頁面。 該映射被稱為隱式映射。 如果Web應用程序定義了* .jsp映射,則其映射優先於隱式映射。

因此,以*.jsp結尾的URL不會被servlet容器映射到Spring。 嘗試修改spring mvc配置是沒有用的。

恕我直言,您有兩種解決方法:

  • 將調度程序servlet映射到/* -但可能會產生副作用,具體取決於配置的其余部分:全面測試所有內容(主要是servlet容器直接提供某些未在<mvc:resources ...>聲明的文件)
  • *.jsp的顯式映射添加到調度程序*.jsp但請確保對其進行說明,以方便日后在其他情況下發生時解決此問題。

如果調度程序servelet沒有處理對靜態資源的定義請求,則將其配置為

<mvc:resources mapping="/resources/**" location="/resources/" />

因此,調度程序servlet不會處理/resources/格式的任何URL。

這不僅與春天有關。 在JAVA Web中,如果您不希望人們直接訪問文件,請在瀏覽器中鍵入地址,然后將其放在WEB-INF文件夾中。 您可以根據需要在此處創建子文件夾。

干杯!

我開始在MVC DispatcherServlet中放置斷點,試圖查看它在什么點上檢查擴展並以不同方式處理.jsp擴展,這清楚地表明“ /SomeUrl/something.jsp”請求並沒有進入DispatcherServlet,所有。 因此,問題必須出在web.xml中,而不是在DispatcherServlet的配置中。

經過實驗后,我找到了解決方案。 我有:

<url-pattern>/</url-pattern>

替換為:

<url-pattern>/*</url-pattern>

現在已經解決了這個問題,盡管我對此感到很驚訝,但/和/ *之間有區別

非常感謝您嘗試幫助解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM