@PathVariable注解应该不是新鲜东西了Spring3.0就开始有了

URL中通过加占位符把参数传向后台

举个栗子,如下比较要说的内容比较简单就大概齐的写一下

画面侧

$.ajax({
type : "GET",
url : /test/code1,
dataType : "html",
success : function(data, status, xhr) {
//TODO
},
error : function(XMLHttpRequest, status, errorThrown) {
//TODO
}
});

这里的code1 就是你要传入的参数了

Contoller侧

@RequestMapping(value = "/test/{code}", method = RequestMethod.GET)
public String getTestName(@PathVariable String code) {
//TODO
}

[{code}]在URL中的占位符,用@PathVariable注解来做映射
※这里有一个注意点就是 url 中的 code 参数名 要和 @PathVariable 注解的这个 code 参数名要一致
背景算是说完了,现在就可以拿着用了
接下来说遭遇的问题 先说[#]
如果你入力的内容中包含#号那么就是悲剧了
要么404 要么找的不对然后画面崩溃

如果你没报出404的情况有可能是因为他找到了初期化的那个函数并非你期待的那个

比如,如下

虽然的url是/mst_users/#/

但它找的是/mst_users后面的#号被无视了

我们期待的是下面的这个函数

@RequestMapping(value = "/mst_users/{userId}", method = RequestMethod.GET)
@ResponseBody
public String getSkuName(@PathVariable("userId") String userId,HttpServletRequest request) {

这时候的解决方案就是转码
先找到了escape()函数还有如下
【该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。
废弃的 escape() 方法生成新的由十六进制转义序列替换的字符串. 使用 encodeURI 或 encodeURIComponent 代替.】
虽然不推荐但可以先试试

现在已经明显看到 # 被编译成 %23 ok继续走

果然这次进到了我们期待的函数了且 %23也自动解码成#了

ps encodeURIComponent函数也试过了没问题这里就不贴代码了

他们的主要的区别就是各个函数的编码和不编码的范围不一样需要的自己查一下吧

继续说当遇到[.]

这个也比较有意思 如果你传入的类似 1.2 、a.b 这样的那么 后天接收到的可能是这样的

1.2  → 1

a.b →  a

即使用了转码函数也没用因为刚刚说的那个两个函数都不会都【.】进行转码的

找到了两个解决方法

①在URL得占位参数后面加上【:.+】

  比如  /mst_users/{userId} → /mst_users/{userId:.+}

②在原本的后面加【.{ext}】当然你的函数列表里也得追加 【@PathVariable("ext") String ext】

  就是把【.】前后分成了两个参数来接收

看一下①的效果吧

②就不贴图了 说一下问题吧

①和②都有的问题 就是 如果只输入 【.】的话都会报错还是找不到对的函数

这是比较郁闷的就是说即使用了这些解决办法还是不能接受任意的输入

可能还是要配合相应的check来使用吧...

ps:【/】同【.】就不赘述了...

------------------------------------------------------------------------------------------------

如果你是任性期待可以接收任意输入的 也不是绝对不行

比如 自己定义 把【.】【/】对应的转换特定的字符然后到后台在转换出来

但是呢 这样吧 一是不够哦优雅或者直接可以说成笨拙 二就是有个bug

既然你已经任性的可以输入任意了那么别人的输入就是你的特定字符这就尴尬

所以必要的check还是少不了的 仅是私以为 如果有什么好的也请告知,学习

------------------------------------------------------------------------------------------------

最后的比较靠谱的解决方案

一就是上面写的两个解决方法 + 对应的check

二就是这种URL里传值的方式就被放弃之间 换成传统的json 传输吧

这些都是很个人的想法,如果有更好的请不吝分享

Spring 当 @PathVariable 遇上 【. # /】等特殊字符的更多相关文章

  1. 当@PathVariable遇上中文和点

    当@PathVariable遇上中文和点 Spring MVC从3.0开始支持REST,而主要就是通过@PathVariable来处理请求参数和路径的映射.  由于考虑到SEO的缘故,很多人喜欢把新闻 ...

  2. jQuery选择器遇上一些特殊字符

    学习jQuery过程中,发现一些特殊字符,如“.”,“#”,"(","]"等.它在选择器应用时,按照普通处理就会出错.解决办法,就是使用转义字符来处理,这有点象 ...

  3. 当DataTable的列名遇上特殊字符"["和"]"时

    刚才有看到一个问题http://bbs.csdn.net/topics/390781072.是在DataTable获取某列最小值,但是在动态生生DataTable时,列名有遇上特特殊字符"[ ...

  4. RowFilter遇上特殊字符*%'[]\

    开发时,时不时需要分析DataView的数据.计算,过滤等 .但是处理的值有可能会遇上是带有特殊字符*.%.'.[.]和\ .需要手动在表达式中,处理这些特殊字符,需要再使用"[" ...

  5. Spring MVC的文件上传

    1.文件上传 文件上传是项目开发中常用的功能.为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有在这种情况下,浏览器才会把用户 ...

  6. 谁还没遇上过NoClassDefFoundError咋地——浅谈字节码生成与热部署

    谁还没遇上过NoClassDefFoundError咋地--浅谈字节码生成与热部署 前言 在Java程序员的世界里,NoClassDefFoundError是一类相当令人厌恶的错误,因为这类错误通常非 ...

  7. Spring MVC @PathVariable被截断

    一.问题描述 一个控制器提供RESTful访问信息: @RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + &qu ...

  8. 微服务中台落地 中台误区 当中台遇上DDD,我们该如何设计微服务

    小结: 1. 微服务中台不是 /1堆砌技术组件就是中台 /2拥有服务治理就是中台 /3增加部分业务功能就是中台 /4Cloud Native 就是中台 https://mp.weixin.qq.com ...

  9. 四探循环依赖 → 当循环依赖遇上 BeanPostProcessor,爱情可能就产生了!

    开心一刻 那天知道她结婚了,我整整一个晚上没睡觉,开了三百公里的车来到她家楼下,缓缓的抽了一支烟...... 天渐渐凉了,响起了鞭炮声,迎亲车队到了,那天披着婚纱的她很美,真的很美! 我跟着迎亲车队开 ...

随机推荐

  1. 如何在vue-cli webpack中全局引入jquery

    1.首先执行:npm install  jQuery --save-dev,在package.json里加入jQuery. 2.修改build下的webpack.base.conf.js 方法一: 首 ...

  2. Maven工程搭建spring boot+spring mvc+JPA

    添加Spring boot支持,引入相关包: 1.maven工程,少不了pom.xml,spring boot的引入可参考官网: <parent> <groupId>org.s ...

  3. 【JavaScript的五种基本数据类型及转换】

    js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Null,Undefined),和一种混合数据类型就是特殊的(Object). "undefined& ...

  4. 【JavaScript流程控制语句的用法及练习】

    1.做判断(if语句) if语句是基于条件成立才执行相应代码时使用的语句. 语法:  if(条件){  条件成立时执行代码   } 例子:1.假设你应聘web前端技术开发岗位,如果你会HTML技术,你 ...

  5. AtCoder Regular Contest 082

    我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...

  6. 基于Windows下python3.4.1IDLE常用快捷键小结

    安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.ALT ...

  7. c++(循环单向链表)

    前面的博客中,我们曾经有一篇专门讲到单向链表的内容.那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面.有了循环,意味着我们可以从任何一个链表节点开始工作,可 ...

  8. c++(线性堆栈)

    前面我们讲到了队列,今天我们接着讨论另外一种数据结构:堆栈.堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计.那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面: ...

  9. 基础二 day4

    昨日回顾int bit_lenth()bool int ----> bool 非零True,0 False bool----> True 1 False 0 str ----> bo ...

  10. 安装Ruby、Sass与Compass

    sass基于Ruby语言开发而成,因此安装sass前需要安装Ruby.(注:mac下自带Ruby无需在安装Ruby!) window下安装SASS首先需要安装Ruby,先从官网下载Ruby并安装.安装 ...