java - How to disable processing of JSP URLs in Spring MVC? -
i have spring mvc app various methods annotated example
@requestmapping(value="/someurl/{filename:.+}", method=requestmethod.get) in majority of cases works fine; ".+" regex means filenames containing dot character extension work fine (as described here spring mvc @pathvariable getting truncated )
however if request "/someurl/something.jsp", request never hits method, presumably because spring mvc has built in processing notices extension .jsp , searches actual file called something.jsp.
my app have jsps, accessed via @requestmapping methods or servlets, jsps never accessed directly. how can disable spring mvc performing special processing .jsp extension?
fyi in web.xml pipe mvc dispatcher so:
<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 contains following:
<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 looking @ accept headers --> <property name="favorpathextension" value="false" /> </bean> <!-- allows static content (the css file) accessed still via dispatcher --> <mvc:resources mapping="/resources/**" location="/resources/" /> <context:component-scan base-package="com.myservicepackage" /> many suggestions on this!
mapping dispatcher servlet / not same mapping /*. /*, ask servlet container give requests spring mvc dispatcher servlet. /, set dispatcher servlet default servlet servlet container, low priority catch all.
from servlet specification 3.0, chapter 12 mapping requests servlets :
the first successful match used no further matches attempted:
- the container try find exact match of path of request path of servlet. successful match selects servlet.
- the container recursively try match longest path-prefix. done stepping down path tree directory @ time, using ’/’ character path separator. longest match determines servlet selected.
- if last segment in url path contains extension (e.g. .jsp), servlet container try match servlet handles requests extension. extension defined part of last segment after last ’.’ character.
- if neither of previous 3 rules result in servlet match, container attempt serve content appropriate resource requested. if "default" servlet defined application, used. many containers provide implicit default servlet serving content.
the order of descending priority servlet mapping /* *.jsp, /. , servlet container have implicit mapping *.jsp (from same reference) :
if container has internal jsp container, *.jsp extension mapped it, allowing jsp pages executed on demand. mapping termed implicit mapping. if *.jsp mapping defined web application, mapping takes precedence on implicit mapping.
so url ending in *.jsp not mapped spring by servlet container. no use try modify spring mvc configuration.
imho, have 2 ways solve :
- map dispatcher servlet
/*- depending on remaining parts of configuration may have side effects : thoroughly test (it if servlet container directly serve files not declared in<mvc:resources ...>) - add explicit mapping
*.jspdispatcher servlet - sure document fix problem if occurs later
Comments
Post a Comment