spring自定义addArgumentResolvers参数解析器-解决用户id问题
- 1.先看控制层
- 2.编写参数解析器
- 3.配置 addArgumentResolvers自定义参数处理器
- 4.测试
-
喜欢的小伙伴可以点赞、关注、收藏哦 -
-- 技术源于追求,技术改变生活 --
在项目中一些接口都应该经常会用到用户id,你们是怎么传的呢?
像我之前就是将用户id拼接到路径后!!!!
非常非常的不安全,最主要的是看起来很low,很low
所以在实习公司学到的新招来了
首先强调一下我们的目的是在请求到达接口前,将接需要用户的一些信息不论是在token或其它一些加密信息中提取出来,然后给到接口接收的参数上!!!
1.先看控制层
/**
* @author LIJW
* @date 2021/7/15 3:54 下午
*/
@RestController
@RequestMapping("/abc")
public class test {
@GetMapping
public R getabc(abc abc){
System.out.println(abc.getAba());
return R.ok(abc.getAba());
}
}
- 我的控制层 test方法接收用户信息,abc对象里有aba(代表用户id)
2.编写参数解析器
import org.apache.commons.lang.StringUtils;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.HttpServletRequest;
/**
* @author LIJW
* @date 2021/7/15 3:59 下午
*/
@Component
public class testResolver implements HandlerMethodArgumentResolver {
//此方法用来判断本次请求的接口是否需要解析参数,如果需要返回true,然后调用下面的resolveArgument方法
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return abc.class.equals(methodParameter.getParameterType());
}
//真正的解析方法
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
abc abc = null;
//拿到http请求头,从头里拿到想要的信息,也可以是token
HttpServletRequest httpServletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
if (httpServletRequest != null){
//拿到想要的信息
String puge = httpServletRequest.getHeader("puge");
if (StringUtils.isNotEmpty(puge)){
abc = new abc();
abc.setAba(puge);
}
}
//返回,这里返回后,接口里要接收的对象就解析好我们的参数啦
return abc;
}
}
3.配置 addArgumentResolvers自定义参数处理器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
import java.util.List;
/**
* @author LIJW
* @date 2021/7/15 4:09 下午
*/
@Configuration //这个注解不能丢
public class ass implements WebMvcConfigurer {
@Autowired
private testResolver testResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(testResolver);
}
}
加鸡腿:WebMvcConfigurer是一个接口,提供很多自定义的拦截器,例如跨域设置、类型转化器等等。可以说此接口为开发者提前想到了很多拦截层面的需求,方便开发者自由选择使用。
4.测试
还有一种是使用注解:https://www.cnblogs.com/qinyuguan/p/12498868.html
完结散花,这样就可以在请求到达接口之前,获取解密一些参数,然后给到接口,然后进行其它业务逻辑!!!!!!!