Spring 当 @PathVariable 遇上 【. # /】等特殊字符
@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 遇上 【. # /】等特殊字符的更多相关文章
- 当@PathVariable遇上中文和点
当@PathVariable遇上中文和点 Spring MVC从3.0开始支持REST,而主要就是通过@PathVariable来处理请求参数和路径的映射. 由于考虑到SEO的缘故,很多人喜欢把新闻 ...
- jQuery选择器遇上一些特殊字符
学习jQuery过程中,发现一些特殊字符,如“.”,“#”,"(","]"等.它在选择器应用时,按照普通处理就会出错.解决办法,就是使用转义字符来处理,这有点象 ...
- 当DataTable的列名遇上特殊字符"["和"]"时
刚才有看到一个问题http://bbs.csdn.net/topics/390781072.是在DataTable获取某列最小值,但是在动态生生DataTable时,列名有遇上特特殊字符"[ ...
- RowFilter遇上特殊字符*%'[]\
开发时,时不时需要分析DataView的数据.计算,过滤等 .但是处理的值有可能会遇上是带有特殊字符*.%.'.[.]和\ .需要手动在表达式中,处理这些特殊字符,需要再使用"[" ...
- Spring MVC的文件上传
1.文件上传 文件上传是项目开发中常用的功能.为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data.只有在这种情况下,浏览器才会把用户 ...
- 谁还没遇上过NoClassDefFoundError咋地——浅谈字节码生成与热部署
谁还没遇上过NoClassDefFoundError咋地--浅谈字节码生成与热部署 前言 在Java程序员的世界里,NoClassDefFoundError是一类相当令人厌恶的错误,因为这类错误通常非 ...
- Spring MVC @PathVariable被截断
一.问题描述 一个控制器提供RESTful访问信息: @RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + &qu ...
- 微服务中台落地 中台误区 当中台遇上DDD,我们该如何设计微服务
小结: 1. 微服务中台不是 /1堆砌技术组件就是中台 /2拥有服务治理就是中台 /3增加部分业务功能就是中台 /4Cloud Native 就是中台 https://mp.weixin.qq.com ...
- 四探循环依赖 → 当循环依赖遇上 BeanPostProcessor,爱情可能就产生了!
开心一刻 那天知道她结婚了,我整整一个晚上没睡觉,开了三百公里的车来到她家楼下,缓缓的抽了一支烟...... 天渐渐凉了,响起了鞭炮声,迎亲车队到了,那天披着婚纱的她很美,真的很美! 我跟着迎亲车队开 ...
随机推荐
- java使用poi自定义excel标题头并导出(springmvc+poi)
项目使用的是jeecg开源框架(springmvc+spring+hibernate+......等)此代码仅供参考!如有更好的意见或建议可留言. 1 controller 层 /** * excel ...
- 循序渐进之Spring AOP(4) - Introduction
前面描述的几种增强(Advice)都是在目标方法范围内织入,而引介(Introduction)不同,直接在类级别上添加目标未实现的接口方法. 在spring中可以通过扩展DelegatingIntro ...
- HDU 1248 寒冰王座(完全背包裸题)
寒冰王座 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- js取整并保留两位小数的方法
js 四舍五入函数 toFixed(),里面的参数 就是保留小数的位数.注意 toFixed()方法只针对数字类型,如果是字符类型需要使用Number()等方法先转换数字类型再使用 document. ...
- [国嵌攻略][044][初始化Bss段]
BSS段的作用 1.变量存储的空间 初始化的全局变量:数据段 未初始化的全局变量:BSS段 局部变量:栈 动态分配变量:堆 2.为什么要对BSS段初始化 未初始化的全局变量在使用时才被赋值,未了避免在 ...
- SDP(1):ScalikeJDBC-基本操作介绍
简单来说:JDBC是一种开放标准的跨编程语言.跨数据库类型编程API.各类型数据库产品厂商都会按它的标准要求来提供针对自身产品的JDBC驱动程序.最主要的这是一套成熟的工具,在编程人员中使用很普及.既 ...
- java中类的加载过程和对象的创建过程
1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...
- 【ELK_Log4net】.net Core重写一个TcpAppender
最近再搞ELK,三个工具部署完毕,想再继承上log4net.没想到.net core版Log4net竟然没有直接Tcp发送消息的appender.醉了.log4net 1.RemotingAppend ...
- SSL和SSH有什么区别
SSL 是一种安全协议,它为网络(例如因特网)的通信提供私密性.SSL 使应用程序在通信时不用担心被窃听和篡改. SSL 实际上 是共同工作的两个协议:"SSL 记录协议"(SSL ...
- 【开发技术】refactor 重构----实现文件改名
当我们要改类名或接口名时,可能会遇到该类(接口)在其它文件中也有使用的情况,如一个个找比较麻烦也容易漏,这里推荐使用右键refactor->rename进行修改.