Spring 当 @PathVariable 遇上 【. # /】等特殊字符

时间:2023-01-08 09:58:53

@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的情况有可能是因为他找到了初期化的那个函数并非你期待的那个

比如,如下

Spring 当 @PathVariable 遇上 【. # /】等特殊字符

虽然的url是/mst_users/#/

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

Spring 当 @PathVariable 遇上 【. # /】等特殊字符

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

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

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

Spring 当 @PathVariable 遇上 【. # /】等特殊字符

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

Spring 当 @PathVariable 遇上 【. # /】等特殊字符

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

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

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

继续说当遇到[.]

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

1.2  → 1

a.b →  a

Spring 当 @PathVariable 遇上 【. # /】等特殊字符

Spring 当 @PathVariable 遇上 【. # /】等特殊字符

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

找到了两个解决方法

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

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

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

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

看一下①的效果吧

Spring 当 @PathVariable 遇上 【. # /】等特殊字符

Spring 当 @PathVariable 遇上 【. # /】等特殊字符

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

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

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

可能还是要配合相应的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. MVC遇上bootstrap后的ajax表单模型验证

    MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...

随机推荐

  1. 【CoreAnimation】1 到 5

    学习资源来自:图层树 . Quartz 2D Core Animation 复合引擎,职责为尽可能快地组合屏幕上不同的可视内容.这些内容被分解成多个独立的图层,存储在 图层树 的体系中.于是这个树形成 ...

  2. python自动化框架nose

    python除了unittest,还有一款更快捷的nose,nose可以说是对unittest的一种简化吧 但是他不需要unittest那种必须有固有的格式,他只需要文件,类名,方法名等含有test就 ...

  3. android简单登陆和注册功能实现+SQLite数据库学习

    最近初学android,做了实验室老师给的基本任务,就是简单的登陆和注册,并能通过SQLite实现登陆,SQlLite是嵌入在安卓设备中的 好了下面是主要代码: 数据库的建立: 这里我只是建立了一个用 ...

  4. C语言做一个通讯录程序(在console里面运行)

    最近复习C语言的时候看到网上有个C语言通讯录的小项目,于是看了下那个程序实现的大概的功能,然后自己也跟着做了个.代码还算简洁,贴上来给有需要的人. // // main.m // AdressBook ...

  5. YII学习,初体验 ,对YII的一些理解.

    先说点没用的: 不会选择,选择后不坚持,不断的选择.这是人生中的一个死循环,前两一直迷茫.觉得自己前进方向很不明朗.想去学的东西有很多.想学好YII,想学PYTHON 想学学hadoop什么的,又想研 ...

  6. 十六、springcloud(二)Eureka集群

    1.创建子工程spring-cloud-peer(jar) 2.创建application-peer1.properties,application-peer2.properties applicat ...

  7. 【noip模拟赛4】汽艇 模拟

    描述 一天sxc,zsx,wl到gly坐汽艇,本来和其他的人约好了一起去,结果被放了鸽子,3人便只有一人负担x元去坐汽艇(很贵哦).坐了才发现如果汽艇上人多了位置就不宽敞,就不好玩了.而3个人貌似是最 ...

  8. LeetCode 37 Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 111221 ...

  9. bzoj1059矩阵游戏

    题目链接 矩阵快速幂+二分图匹配, 对于对角线上的每个点看看能不能换到就行, 但是一开始$dicnic$写挂了 只好写的匈牙利 /*********************************** ...

  10. CocoaPods学习系列4——进阶用法

    这篇文章,记录一下CocoaPods的进阶用法. 进阶用法主要体现在.podspec文件和Podfile的配置上. .podspec文件的进阶配置 以官方的一个.podspec文件示例细说: Pod: ...