[英]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:
使用第一個成功的匹配,不嘗試其他匹配:
servlet映射的優先級降序為/*
*.jsp
, /
。 Servlet容器通常具有*.jsp
的隱式映射(來自相同的參考):
如果容器具有內部JSP容器,則將* .jsp擴展名映射到該容器,從而允許按需執行JSP頁面。 該映射被稱為隱式映射。 如果Web應用程序定義了* .jsp映射,則其映射優先於隱式映射。
因此,以*.jsp
結尾的URL不會被servlet容器映射到Spring。 嘗試修改spring mvc配置是沒有用的。
恕我直言,您有兩種解決方法:
/*
-但可能會產生副作用,具體取決於配置的其余部分:全面測試所有內容(主要是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.