SpringMVC中如何获取@PathVariable的值

目录
  • 如何获取@PathVariable的值
    • 一、地址:**/{id}
    • 二、方式
  • springmvc 使用@PathVariable时,应该注意点什么?
    • 一、使用@PathVariable的转变过程
    • 二、个人总结

如何获取@PathVariable的值

一、地址:**/{id}

@RequestMapping(value = "/del/{id}", method = RequestMethod.GET)
public void del(HttpServletRequest request, @PathVariable("id") Long id){
   System.out.println(id);
}

二、方式

1、直接通过@PathVariable注解获取

    @RequestMapping(value = "/del/{id}", method = RequestMethod.GET)
    public void del(HttpServletRequest request, @PathVariable("id") Long id){
       System.out.println(id);
    }

2、通用@PathVariable注解批量获取, 只有注解的参数才能得到

@RequestMapping(value = "/del/{id}", method = RequestMethod.GET)
   public void del(HttpServletRequest request, @PathVariable("id") Long id){
        NativeWebRequest webRequest = new ServletWebRequest(request);
        Map<String, Object> map = (Map<String, Object>) webRequest.getAttribute(View.PATH_VARIABLES, RequestAttributes.SCOPE_REQUEST);
        System.out.println(map.get("id"));
  }

3、批量获取,不需要任何注解

@RequestMapping(value = "/del/{id}", method = RequestMethod.GET)
  public void del(HttpServletRequest request){
       NativeWebRequest webRequest = new ServletWebRequest(request);
       Map<String, String> map = (Map<String, String>) webRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
       System.out.println(map.get("id"));
  }

springmvc 使用@PathVariable时,应该注意点什么?

近来在做库存调剂系统时,我从前台到后台的传值方式,主要包括:1个,用@PathVariable或者@RequestParam从路径取;大于一个,用于更新或者添加操作的,我用的是表单实体传到后台;大于一个,用于查询的,我用的@RequestBody(好吧,我承认这个只是我觉得好玩,但没有多少人愿意在后台一行又一行的写:String test=request.getParameter("test");吧?????)

现在,主要就是想说一个从路径取值的“坑”,而重中之重,就想说一下我更偏爱的@PathVariable(别问我为什么,/{param}/fn.do,简单啊)

一、使用@PathVariable的转变过程

首先:

在盘古开天辟地时,就是一切还很混沌时,姑娘我连用@PathVariable取值都没有取过来,还蒙圈蒙了一小会儿,完全不明白发生了什么,因为我看着我的语法和格式,哪儿哪儿都对,但就是没有传过来值。我一想我原来写/{param}/fn.do这种方式传值的时候,也没有问题呀,怎么今天是见鬼了???? 蒙圈完了之后,就发现端倪了。

请看看我怎么写的哈:

@RequestMapping("/dealerStock/swapOrder/{orderID}/cancelAuditThisOrder.do")
public @ResponseBody String cancelAuditThisOrder(@PathVariable("OrderID") String strOrderID)){
...
...
}

然后的然后,我就一直没有请求到这个方法,更别谈什么有没有取到值的问题!后来解决的时候,真想一掌拍自己脑门上!

然后:

当代码规范审查通过后,也经过了测试部的一级功能业务测试以及业务部的二级业务流程测试。文档之类的,都准备好了(我还能再说什么呢,无声的两个呵 呵) 正要布上去生产线的时候,老大再次审查了一遍代码,审查到最后也没个啥结果,但是,突然间看到那个@PathVariable就问了我两个问题:

  • 一、如果我的ID是不连续的,这种方法还能好使吗?比如说:HC 782981;
  • 二、是不是只要我拿到这个请求路径,而我随便推测一个ID号,就能避过用户操作别人的数据?

姑娘我再次被雷击倒,无言以对,马上实际验证。结果:Yes! 你说第一个的结果是Yes,这个我很满意,但第二个是Yes,就很想哭了。 测试出结果后,就请命去干掉这个问题了。

我的第一步尝试:

添加method=RequestMethod.post,也就是说用户不能输入Url地址以get的形式获取数据,只能通过系统内部请求。

  • 组长:你自己说,就算咱们改成了Post请求,你能不能访问到?
  • 姑娘:我能,就自己写一个按钮,再用post请求就行了。如果用户里面有懂点程序编码的,轻而易举就能破掉。我再去改
  • 组长:其实,我们只能防君子,哪个系统都有漏洞,没有绝对的权限控制和安全,但咱们尽量的给做好。

我的第二步尝试:

在第二步尝试前,我想了一会儿。我发现这个事件有以下几个突破口:

  • 一、像订单编号这个敏感的数据,能不能做到不被推测出来?
  • 二、用户是根据访问路径,然后加上一个ID号去请求,如果用户拿不到访问路径呢?
  • 三、要点就是用户只能操作自己的数据,我可以在敏感操作的时候,同时校验当前用户。
  • 四、既然都是@PathVariable这种方式带来的一些问题,那我可以把相应的方法,换掉这种传值方式。
  • 五、用户看到的是一个请求方法路径,我可不可以在路径中加入随机密码盐,进一步的控制关键操作的访问。

好吧,为了方便迅速,我直接把这种传值方式给改了。当然也没有改完,时间关系,像一些本来就属于公开数据的内容,还是没改。

我的第三步尝试:

在第二步的时候,就已经改完代码了。然后,我觉得我是一个很较真的人。忙里偷闲,我把我在第二步尝试中想到了几个点,都写代码测了测。最先测出来的是第三种(同时检验当前用户,也就简单类似于where orderID=? and userID=? ) 其次,还测了测那个密码盐值,也确实能够控制住,但是,想了想系统的性质和资源的最终走向,没改。然后,去禁止用户打开开发者工具或者查看源代码,然而,这根本不是我能控制住的。我也最多就是能控制住快捷键打开,但人家还有鼠标啊??????浏览器提供的功能,不是我想干掉就干掉滴滴滴滴。

我的第一个方案,就是改造订单生成的方式,然后我觉得吧,这个好像不怎么靠谱。但毫无疑问比当前的生成方式要靠谱得太多,但这要改动下来,呃,原谅我很怂。

二、个人总结

我最大的问题,不是我后来想不出更为优雅的方案去解决,而是,我从根本上,对这是个问题的问题毫无知觉。我甚至都不觉得那样有什么问题,这才是我最该考虑的点。

其实,我用@PathVariable或者什么别的方式去传值,这都无可厚非。但我也应该更进一步的考虑到它的应用场景和系统功能锁涉及到的数据,以及可能带来的后果。就比如说我这个@PathVariable的问题,在别的查询一些区域信息(公共展示数据)的时候,我也这么用了,组长也看见了,但为什么他着重说了订单这一块,还要求这一块必须改。反正,我就是欠思考。。。。。。

很多很多的东西,都是建立在日常生活体验上的。我以前就很崇拜架构师,现在也很崇拜。但是,我突然明白,架构师也不是光有空架子的。就比如说我自己吧,我还算是乱七八糟的想法挺多的那种(虽然并不是每个都靠谱)但是,做事情不能光凭想象,要实际操作的。

感觉最近做得比较好一点的就是:

1,因为有一个地方查询的数据有很多,那天我跟组长提出,我要换一种查询方法,提升查询效率。然后组长就问我究竟想怎么换?我就直接同时运行了两套代码干同样的事儿给他看,结果,就很so easy的换成了我想换的那种方式,我想说的话,全都在代码里。后来弄完了,闲下来,我解释了一下不同点,关键点。

2,因为强调代码规范和效率嘛。我就在自己私下写代码的时候,旁边就放着一本代码整洁之道,还有阿里代码规范手册,然后还有我闲下来的时候,去官网找的一些常用数据结构、数据类型的应用对比。我是一边写,一边看。有不知道怎么写的,就干脆先看一眼,照着书写。刚开始挺痛苦的,因为写一句就错一句,也不能说错,就是不够优美。但是,感觉现在慢慢变得好了特别特别多。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决springmvc使用@PathVariable路径匹配问题

    一.问题 今天作毕设的时候,在搭建ssm框架的使用使用springmvc的@PathVariable时出现了一个路径匹配的问题,最后花了点时间解决了. 代码结构: 问题内容: 访问url为: 按照道理说,我应该到jsp的index页面去.最后的结果确实到了index页面,可是由于该页面引用了几个css和js,报异常找不到.有使用过spring经验的童鞋应该知道使用如下代码解决静态资源的访问. // 方法一 <mvc:default-servlet-handler/> // 方法二 <mv

  • SpringMVC中使用@PathVariable绑定路由中的数组的方法

    问题描述 在开发批量删除功能时,往往都是多条数据,所以前台需要传一个数组给后台,但是怎么在URL中绑定一个数组,同时在后台用@PathVariable来绑定呢? 原来的做法 后台: 前台: 以上是之前项目的截图,直接拿过来啦!!!

  • SpringMVC使用@PathVariable接收参数过程解析

    PathVariable 映射 URL 绑定的占位符 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable("xxx") 绑定到操作方法的入参中. 使用MVC时,总是出现一些问题,当然都是使用造成的. 今天遇到一个问题,使用@PathVariable

  • Springmvc @PathVariable的用法解析

    目录 @PathVariable的用法解析 问题描述 解析过程 动态参数使用@PathVariable 在Controller层的代码如下 @PathVariable的用法解析 问题描述 @RequestMapping(value = "/auth1/{uuid}/xxx", method = RequestMethod.GET) public void imageCode1(@PathVariable (value = "uuid") String uuid) {

  • SpringMVC中如何获取@PathVariable的值

    目录 如何获取@PathVariable的值 一.地址:**/{id} 二.方式 springmvc 使用@PathVariable时,应该注意点什么? 一.使用@PathVariable的转变过程 二.个人总结 如何获取@PathVariable的值 一.地址:**/{id} @RequestMapping(value = "/del/{id}", method = RequestMethod.GET) public void del(HttpServletRequest reque

  • SpringMVC中RequestContextHolder获取请求信息的方法

    RequestContextHolder的作用是: 在Service层获取获取request和response信息 代码示例: ServletRequestAttributes attrs = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attrs.getRequest(); 源码分析: 定义了两个ThreadLocal变量用来存储Reque

  • React在定时器中无法获取状态最新值的问题

    目录 在定时器中无法获取状态最新值 问题原因 问题解决 ReactHook hooks和定时器产生的bug 问题1 解决方案 在定时器中无法获取状态最新值 在做轮播图组件时发现了一个问题,在setInterval中无法通过状态直接获取最新值,如: const [rightTransform, setRightTransform] = useState(pictureSize); const autoPlay = () => { //普通轮播自动播放 timer.current = setInte

  • Android中实时获取音量分贝值详解

    基础知识 度量声音强度,大家最熟悉的单位就是分贝(decibel,缩写为dB).这是一个无纲量的相对单位,计算公式如下: 分子是测量值的声压,分母是参考值的声压(20微帕,人类所能听到的最小声压).因此日常中说道声音强度是多少多少分贝时,都是默认了一个很小的参考值的. 而Android设备传感器可以提供的物理量是场的幅值(amplitude),常用下列公式计算分贝值: 从SDK中读取了某段音频数据的振幅后,取最大振幅或平均振幅(可以用平方和平均,或绝对值的和平均),代入上述公式的A1. 现在问题

  • python中dict获取关键字与值的实现

    目录 dict获取关键字与值 values() items() 字典dict(关键字对应的值为list) 方法一 方法二 dict获取关键字与值 values() >>> d {'p': 34, 'l': 54, 'b': 88} >>> for value in d.values(): ...     print(value) ... 34 54 88 items() >>> for key,value in d.items(): ...     p

  • springboot获取properties属性值的多种方式总结

    目录 获取properties属性值方式总结 1. 除了默认配置在 application.properties的多环境中添加属性 2. 使用之前在spring中加载的value值形式 3. 也可以使用springboot里面的Environment 直接取值 4. 如果是自己新建的一个properties文件 获取多个自定义属性值 比如在application中自定义属性 获取properties属性值方式总结 spring boot 在多环境情况下我们需要根据不同的获取不一样的值, 我们会配

  • SpringMVC中重定向model值的获取方式

    目录 SpringMVC重定向model值的获取 1.步骤一:在控制器中编写 2.编写对应跳转 3.测试:在浏览器访问自己项目下的对应控制器 4.然后浏览器跳转 SpringMVC中model的理解 1.首先将数据添加到Model中 2.然后再将其在页面上展示出来 SpringMVC重定向model值的获取 1.步骤一:在控制器中编写 /*重定向测试*/ @RequestMapping("/m1/t2") public String test1(Model model, String

  • 浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)

    我这里往后端传递checkbox 多选框value的值是通过字符串方式传递,先调用js对选定checkbox遍历获取选的的boxvalue,然后写进隐藏域,最后作文对象的属性提交.见代码:` 前端: <form:form commandName="user" method="post"> <c:forEach items="${deploys}" var="deploy" varStatus="de

  • SpringMVC中Model和ModelAndView的EL表达式取值方法

    model和modelMap(spring 封装),Java.util.Map ModelMap(视图) ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("name", "xxx"); modelAndView.setViewName("/user/index"); return modelAndView; //对于ModelAndView构造函数可以指

  • SpringMVC中请求参数的获取方式

    目录 SpringMVC请求参数获取方式 一.通过 ServletAPI 获取 二.通过控制器方法的形参获取 处理多个同名的请求参数 三.通过 @RequestParam 注解 四.@RequestHeader 注解 五.@CookieValue 注解 六.通过 POJO 获取请求参数 七.解决获取请求参数的乱码问题 SpringMVC请求参数获取方式 一.通过 ServletAPI 获取 可以使用原生 Servlet 获取请求参数,将 HttpServletRequest 作为控制器方法的形参

随机推荐