Java 如何在SpringMVC中禁用JSP URL的处理?
我有一个SpringMVC应用程序,其中有各种方法,例如Java 如何在SpringMVC中禁用JSP URL的处理?,java,spring,jsp,spring-mvc,Java,Spring,Jsp,Spring Mvc,我有一个SpringMVC应用程序,其中有各种方法,例如 @RequestMapping(value="/SomeUrl/{filename:.+}", method=RequestMethod.GET) 在大多数情况下,这种方法效果很好;“+”正则表达式表示包含扩展名的点字符的文件名也可以正常工作(如下所述) 但是,如果请求是“/SomeUrl/somes.jsp”,那么请求甚至不会命中我的方法,这可能是因为Spring MVC内置了一个处理,它会注意到扩展名是.jsp,然后搜索一个名为so
@RequestMapping(value="/SomeUrl/{filename:.+}", method=RequestMethod.GET)
在大多数情况下,这种方法效果很好;“+”正则表达式表示包含扩展名的点字符的文件名也可以正常工作(如下所述)
但是,如果请求是“/SomeUrl/somes.jsp”,那么请求甚至不会命中我的方法,这可能是因为Spring MVC内置了一个处理,它会注意到扩展名是.jsp,然后搜索一个名为somes.jsp的实际文件
我的应用程序确实有JSP,但它们都是通过@RequestMapping方法或servlet访问的,JSP永远不会直接访问。那么,我如何才能禁用SpringMVC,使其无法使用.jsp扩展名执行任何特殊处理呢
仅供参考,在my web.xml中,我将所有内容通过管道传送到MVC dispatcher,如下所示:
<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>
调度员
org.springframework.web.servlet.DispatcherServlet
1.
调度员
/
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" />
非常感谢您对此提出的任何建议 如果dispatcher servelet未处理已定义的静态资源请求,则已将其配置为
<mvc:resources mapping="/resources/**" location="/resources/" />
因此,任何形式为
/resources/
的URL都不会由dispatcher servlet处理。将dispatcher servlet映射到/
与将其映射到/*
并不完全相同。使用/*
,您可以有效地请求servlet容器将所有请求提供给SpringMVCDispatcherServlet。使用/
,您可以将dispatcher servlet设置为servlet容器的默认servlet,这是一个低优先级的包罗万象
Servlet规范3.0第12章将请求映射到Servlet:
第一个成功的匹配将在没有进一步匹配的情况下使用
尝试:
/*
*.jsp
,/
。servlet容器通常具有*.jsp
的隐式映射(来自同一引用):
如果容器具有内部JSP容器,*.JSP扩展将映射到该容器,
允许按需执行JSP页面。这种映射称为隐式映射
映射。如果Web应用程序定义了*.jsp映射,则其映射将
优先于隐式映射
因此,servlet容器不会将以*.jsp
结尾的URL映射到Spring。试图修改SpringMVC配置是没有用的
IMHO,你有两种解决方法:
- 将dispatcher servlet映射到
——但根据配置的其余部分,它可能会产生副作用:彻底测试所有内容(主要是如果servlet容器直接服务于/*
中未声明的某些文件) - 将
的显式映射添加到DispatcherServlet中,但请确保对其进行文档记录,以便在以后出现其他问题时轻松解决问题*.jsp
干杯 我开始在MVC DispatcherServlet中设置断点,试图看看它在什么时候以不同的方式检查扩展和处理.jsp扩展,这清楚地表明“/SomeUrl/something.jsp”请求根本没有进入DispatcherServlet。因此,问题必须在web.xml中,而不是在DispatcherServlet的配置中 经过试验,我找到了解决办法。我有:
<url-pattern>/</url-pattern>
/
替换为:
<url-pattern>/*</url-pattern>
/*
现在已经解决了这个问题,尽管我对此感到相当惊讶,但是/和之间存在差异/*
非常感谢大家对这个问题的帮助。当然可以,但我如何才能得到它,以便“/xxxx/xxx.jsp”形式的请求进入我的方法?它们不是静态资源,访问静态资源的/resources/mapping工作得很好。@nigelg除了格式为
/resources/**
的请求之外,所有请求都将由dispatcher servlet处理。你能添加一些URL不起作用的例子吗?不完全是。格式为/resources/**
的请求由DispatcherServlet
根据映射/
处理。但是由
映射的URL被转发到servlet容器的默认servlet,该servlet知道如何发送静态文件。但这与当前的问题无关。@SergeBallesta OP将资源定义为
,这就是为什么我说带有/resources/**
格式的URL不会由dispatcher servlet处理。@Karna我的理解是,OP希望其控制器处理请求/SomeUrl/*
,即使path参数以.jsp
结尾。这不是一个问题,作为一个静态文件服务任何东西。。。但我的回答也没有抓住要点:-(即使文件是可访问的)