Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringMVC中禁用JSP URL的处理?_Java_Spring_Jsp_Spring Mvc - Fatal编程技术网

Java 如何在SpringMVC中禁用JSP URL的处理?

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

我有一个SpringMVC应用程序,其中有各种方法,例如

@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:

第一个成功的匹配将在没有进一步匹配的情况下使用 尝试:

  • 容器将尝试找到请求路径与servlet路径的精确匹配。成功匹配将选择servlet
  • 容器将递归地尝试匹配最长路径前缀。这是通过使用“/”字符作为路径分隔符,一次将路径树从一个目录中删除来完成的。最长匹配确定所选的servlet
  • 如果URL路径中的最后一段包含扩展名(例如.jsp),servlet容器将尝试匹配处理扩展名请求的servlet。扩展名定义为最后一个“.”字符后最后一段的一部分
  • 如果前三个规则都没有导致servlet匹配,那么容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,则将使用它。许多容器提供一个隐式的默认servlet来提供内容
  • servlet映射的优先级降序顺序为
    /*
    *.jsp
    /
    。servlet容器通常具有
    *.jsp
    的隐式映射(来自同一引用):

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

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

    IMHO,你有两种解决方法:

    • 将dispatcher servlet映射到
      /*
      ——但根据配置的其余部分,它可能会产生副作用:彻底测试所有内容(主要是如果servlet容器直接服务于
      中未声明的某些文件)
    • *.jsp
      的显式映射添加到DispatcherServlet中,但请确保对其进行文档记录,以便在以后出现其他问题时轻松解决问题

    这不仅仅与春天有关。在JAVA Web中,如果您不希望人们直接访问您的文件,请在浏览器中键入地址,将其放入Web-INF文件夹中。您可以根据需要在那里创建子文件夹


    干杯

    我开始在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
    结尾。这不是一个问题,作为一个静态文件服务任何东西。。。但我的回答也没有抓住要点:-(即使文件是可访问的)