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

时间:2015-05-11 13:23:46

标签: java spring jsp spring-mvc

我有一个Spring MVC应用程序,其中包含各种方法,例如

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

在大多数情况下,这种方法非常好; "。+"正则表达式包含带有扩展名的点字符的文件名也可以正常工作(如此处所述Spring MVC @PathVariable getting truncated

但是如果请求是" /SomeUrl/Something.jsp" ;,那么请求甚至都不会命中我的方法,大概是因为Spring MVC内置了处理,注意到扩展名为.jsp然后搜索对于名为Something.jsp的实际文件。

我的应用程序确实有JSP,但它们都是通过@RequestMapping方法或servlet访问的,从不直接访问JSP。那么如何禁止Spring MVC使用.jsp扩展名执行任何特殊处理?

我的web.xml中的FYI我把所有东西都输入到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" />

非常感谢您提出任何建议!

4 个答案:

答案 0 :(得分:4)

将调度程序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。
  5. servlet映射的降序优先级顺序为/* *.jsp/。 servlet容器通常具有*.jsp的隐式映射(来自相同的引用):

    如果容器有一个内部JSP容器,* .jsp扩展名将映射到它, 允许JSP页面按需执行。该映射被称为隐式 映射。如果Web应用程序定义了* .jsp映射,则其映射采用 优先于隐式映射。

    因此,以*.jsp结尾的URL将不会被servlet容器映射到Spring 。尝试修改spring mvc配置是没有用的。

    恕我直言,你有两种方法可以解决它:

    • 将调度程序servlet映射到/* - 但是根据配置的其余部分,它可能有副作用:彻底测试所有内容(主要是因为servlet容器直接提供未在<mvc:resources ...>中声明的某些文件)
    • 为调度程序servlet添加*.jsp的显式映射 - 但是请确保将其记录下来以便在以后与其他人一起使用时轻松解决问题

答案 1 :(得分:0)

如果调度程序servelet未处理定义的静态资源请求,则表明您已将其配置为

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

因此/resources/形式的任何URL都不会被调度程序servlet处理。

答案 2 :(得分:0)

这不仅与春天有关。在JAVA Web中,如果您不希望人们直接在浏览器中输入您的文件,请将它们放在WEB-INF文件夹中。您可以根据自己的意愿创建子文件夹。

干杯!!!

答案 3 :(得分:0)

我开始在MVC DispatcherServlet中放置断点,试图查看它在何种程度上检查扩展并以不同方式处理.jsp扩展,这清楚地表明&#34; /SomeUrl/something.jsp"请求根本没有进入DispatcherServlet。所以问题必须在web.xml中,而不是在DispatcherServlet的配置中。

经过实验,我找到了解决方案。我有:

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

取代它:

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

现在已经解决了这个问题,虽然我对此感到惊讶,但/和/ *之间存在差异

非常感谢您尝试帮助解决这个问题。