①
创建一个注解
// 用于参数
@Target(ElementType.PARAMETER)
// 在程序运行时执行
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
②
创建一个类(CurrentUserArgumentResolver
)实现HandlerMethodArgumentResolver
接口
并重写supportsParameter
方法 和 ArgumentResolver
方法
// 处理器参数解析器
@Component
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {
// MethodParameter parameter 方法的参数
@Override
public boolean supportsParameter(MethodParameter parameter) {
return null;
}
// 此方法返回的值就是前面参数得到的值
// 如何为这个参数赋值
// 这个方法的返回值会直接赋值给解析的参数
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
}
}
③
supportsParameter
方法:
定义一个规则
当前的参数解析器可以处理方法的哪个参数
返回值true即表示可以对这个参数进行处理
resolveArgument
方法:
此方法返回的值就是前面参数得到的值
这个方法的返回值会直接赋值给解析的参数
// 处理器参数解析器
@Component
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {
// MethodParameter parameter 方法的参数
// 定义一个规则
// 当前的参数解析器可以处理方法的哪个参数
// 返回值true即表示可以对这个参数进行处理
@Override
public boolean supportsParameter(MethodParameter parameter) {
// 定义自己的规则
// 规则 1. 参数被@CurrentUser注解标记
// 规则 2. 参数类型是UserBean类型
Class<?> clazz = parameter.getParameterType();
return parameter.hasParameterAnnotation(CurrentUser.class) && UserBean.class == clazz;
}
// 此方法返回的值就是前面参数得到的值
// 如何为这个参数赋值
// 这个方法的返回值会直接赋值给解析的参数
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest req = webRequest.getNativeRequest(HttpServletRequest.class);
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
return user;
}
}
④
在controller中的方法中通过@CurrentUser
注解使用
@Controller
public class UrlController {
public String create(@CurrentUser UserBean userBean){
System.out.println(userBean);
return "book/create";
}
}