Spring动态参数绑定
自动赋值的调用链路:
Contry.getProvince()
- Province.getCity()
- City.getDistrict()
-- District.setDistrictName()
PropertyDescriptor
JDK自带
Java Bean PropertyDescriptor
作用:自动调用类对象的getXXX/setXXX方法,进行取值和赋值
BeanWrapperImpl
Spring自带
BeanWrapperImpl
作用:对Spring容器中管理的对象,自动调用get/set方法,进行取值和赋值
access_log属性
server.xml
org.apache.catalina.valves.AccessLogValve 对象
-
directory: access_log文件输出目录
-
prefix: access_log文件名前缀
-
suffix: access_log文件名后缀
-
pattern: access_log文件内容格式
-
fileDateFormat: access_log文件名日期后缀,默认为.yyyy-MM-dd
mvn clean package打包

在本机找到war包

粘贴到这个路径,并改名为ROOT.war,到bin目录下点击startup.bat启动tomcat,可以看到webapps下生成了ROOT文件夹

根据spring的文件内容访问文件
java
package com.wuya.controller;
import com.wuya.bean.addr.Country;
import com.wuya.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
/**
* 参数自动绑定方式,可以直接将HTTP参数的值赋值到对象属性中,而且支持多级
*/
@Controller
public class UserController {
/**
* 测试地址:http://localhost:8083/addUser?name=wuya&department.name=sec
*/
@RequestMapping("/addUser")
public @ResponseBody String addUser(User user) {
System.out.println("HTTP参数自动赋值给对象属性:"+user.getName()+"----"+user.getDepartment().getName());
return "test OK -- wuya";
}
/**
* 测试地址:http://localhost:8083/addAddr?name=cn&province.city.district.name=yuelu
*/
@RequestMapping("/addAddr")
public @ResponseBody String addAddr(Country country) {
System.out.println("HTTP参数自动赋值给对象属性(多级):"+country.getProvince().getCity().getDistrict().getName());
return "multi test -- wuya";
}
}
访问http://localhost:8083/addAddr?name=cn&province.city.district.name=yuelu
IDE 控制台会把 URL 里的请求参数,映射到接口方法入参(Country对象)的多级属性中,最终通过getter方法拿到了赋值后的属性值并打印出来yuelu
双击startup.bat启动tomcat。
ROOT.war会自动解压为ROOT文件夹。
访问:http://localhost:7299/addUser,能打开代表服务启动正常

启动exploit脚本,会看到ROOT下生成jsp文件


访问http://localhost:8083/wuya.jsp?cmd=

已经成功复现