Java SpringWebMVC控制器接受“.com/”,但拒绝url中的“.com”,并抛出406错误
我是新来的Java SpringWebMVC控制器接受“.com/”,但拒绝url中的“.com”,并抛出406错误,java,spring,Java,Spring,我是新来的springwebmvcplz请容忍我,由于我对这个主题缺乏理解,我无法准确地发布我要问的问题。我只能说springmvc文件扩展名 继承了maven+springwebmvc5.1.2.版本project 在linux平台上部署mvn-buildedfooapp.war到tomcat 8.5.58 我的问题是当我在浏览器中为/mail/{address}端点调用RESTAPI时 案例1) 如果uri末尾没有/,它将返回http状态406-根据请求中接收到的主动协商标头字段,目标资
springwebmvc
plz请容忍我,由于我对这个主题缺乏理解,我无法准确地发布我要问的问题。我只能说springmvc文件扩展名
- 继承了
projectmaven+springwebmvc5.1.2.版本
- 在
平台上部署linux
fooapp.war到mvn-builded
tomcat 8.5.58
/mail/{address}
端点调用RESTAPI时
案例1)
如果uri末尾没有/
,它将返回http状态406-根据请求中接收到的主动协商标头字段,目标资源没有用户代理可以接受的当前表示,并且服务器不愿意提供默认表示。
http://localhost:<port>/fooapp/mail/john@bar.com
我无法从不了解其原因开始,制定一个恰当的问题,但我尽了最大努力从www
中寻找线索。我找到了许多线索,但它们吸引了我的目光:
web.xml
中,首先将/
替换为/*
,用于url模式
<servlet>
<servlet-name>fooapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:fooapp.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>fooapp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
</bean>
以及FooController.java
的精简版
@RestController
@RequestMapping("/mail/{address}")
public final class FooController {
@RequestMapping(method = RequestMethod.GET, produces = "application/json")
public String doSomething(
@PathVariable("address") String address, HttpServletResponse response) {
// execute code...
return josnData;
}
不知道我在做什么,我的尝试并没有改变结果。为什么对.com
和.com/
的处理不同?以及如何使用.com
获得正确的响应
更新
我可能发现了一个线索:
我会试试它说什么
有了^建议,我能够避免http状态406
,但是当FooController
使用电子邮件地址时,它会删除.com
,这样与eamil地址相关的数据就不会返回
我尝试的建议是在fooapp.xml
中添加以下内容
<servlet>
<servlet-name>fooapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:fooapp.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>fooapp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
</bean>
找到了解决方案
在这篇文章中:
通过在控制器中添加mail/{address:.+}
以及^solution一起修复了问题。我将尝试将端点规范,“/mail/{address}”
从类注释移动到方法注释。我认为现在的情况是,它希望该方法向url的路径中添加一些内容,因此需要查看结尾处的/
。Ty@Steve以获取您的时间和建议。我尝试将/mail/{address}
移动到该方法,但不幸的是,当FooController
消耗日志文件中的完整电子邮件地址时,.com
被切断,我看到了相同的结果。。。虽然我逐渐理解了这个问题的原因,但我还是很感激您的建议。我会尝试将端点规范,“/mail/{address}”
从类注释移动到方法注释。我认为现在的情况是,它希望该方法向url的路径中添加一些内容,因此需要查看结尾处的/
。Ty@Steve以获取您的时间和建议。我尝试将/mail/{address}
移动到该方法,但不幸的是,当FooController
消耗日志文件中的完整电子邮件地址时,.com
被切断,我看到了相同的结果。。。虽然我逐渐了解这个问题的原因,但我还是很感激你的建议。。