拦截器获取requestMapping、restful风格中路径的参数
拦截器获取restful风requestMapping、参数
当我们使用spring框架时候,在拦截器或aop时有时会使用到方法中的参数或者是映射地址来帮助我们处理业务逻辑。我们怎么获取他们呢,spring已经给我们封装好了,直接拿来就可以使用。
如何获取requestMapping
获取类+方法的requestMapping,例如最终获取的是query/user/{id},获取的是最原始的url路径。
request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)
@GetMapping("getUser/{id}")
public Student getUser2(@PathParam("id") String id,HttpServletRequest request){
System.out.println(request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE));
Student student = new Student(11,"zhangsan",1,2);
return student;
}
result:
/getUser/{
id}
此处代码主要是用于拦截器、aop使用,获取映射路径,此方法的好处是如果是restful风格的api也会返回最原始的requestMapping。
获取参数
获取参数应该很简单,在拦截器获取sop中我们有时会获取参数值,根据值不值处理不同的逻辑。
现在有个问题,当使用request.getParameterMap()并不能获取restful中path的参数,那么我们如何获取呢
http://127.0.0.1:8080/getUser/1?nama=zhangsan
@GetMapping("getUser/{id}")
public Student getUser2(@PathVariable("id") String id, HttpServletRequest request){
System.out.println(id);
Map<String, String[]> parameterMap = request.getParameterMap();
System.out.println("body中参数:" + new Gson().toJson(parameterMap));
Map attribute = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
System.out.println("restful中path参数:" + attribute);
Student student = new Student(11,"zhangsan",1,2);
return student;
}
result:
body中参数:{
"nama":["zhangsan"]}
restful中path参数:{
id=1}
可以看到我们需要结合HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE来获取参数信息。
此时我们只知道参数的key时,我们先根据 request.getParameter(“name”)取值,然后再根据path中取值。