URL地址中含有点号导致参数解析错误的解决办法

来源:互联网 发布:人工智能替代人类 编辑:程序博客网 时间:2024/03/29 08:30

在Spring MVC中,Controller的配置如下:

@Controllerclass IndexController {    @RequestMapping("/{ip}")    public Model detail(@PathVariable("ip") String ip) {        //  对IP进行处理        Model model = IpService.find(ip);        return model;    }}

前端的请求方式为:

let url = '/' + '192.168.1.1';$.getJSON(url, datas => {    //  处理逻辑})

在实际的执行过程中,后台接收到的IP竟然为“192.168.1”,最后一个“.1”竟然被截断了,这是因为Spring MVC自动的路径解析策略导致的错误,具体的配置如下:

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManager">    <constructor-arg>        <array>            <bean class="org.springframework.web.accept.HeaderContentNegotiationStrategy"/>            <!-- 根据后缀名来决定请求的视图类型 -->            <bean class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">                <constructor-arg>                    <map>                        <entry key="xml" value="application/xml" />                        <entry key="json" value="application/json" />                        <entry key="html" value="text/html" />                        <entry key="htm" value="text/html" />                        <entry key="txt" value="text/plain" />                        <entry key="xls" value="application/vnd.ms-excel" />                    </map>                </constructor-arg>            </bean>        </array>    </constructor-arg></bean>

看到后缀名解析策略竟然具有如此多的功能,直接废除感到太可惜,那只好换种解决方法了,将@PathVariable改为@RequestParam,JAVA实现如下:

@Controllerclass IndexController {    @RequestMapping("/")    public Model detail(@RequestParam("ip") String ip) {        //  对IP进行处理        Model model = IpService.find(ip);        return model;    }}

前端请求方式改为参数传递方式,如下:

let url = '/';$.getJSON(url, {ip:'192.168.1.1'}, datas => {    //  处理逻辑})

再次更新程序,一切正常!

结论

在Spring MVC框架中,会将地址中的最后一个点号截断为后缀名,从而判断其请求消费的内容类型,在不改变此策略的情况下,修改请求方式与地址也能达到正确处理的目标。

阅读全文
0 0
原创粉丝点击