记录一下 关于参数解析器 会话请求上下文注入数据所有 controller 均可接收
需求:需要在拦截器中 认证用户身份并且把用户 但是在控制器层需要到用户Dao的数据时 还得 去操作Dao或者 从session 中取,如果存在web无状态情况 即无session 时则需要把数据存入当前会话请求的上下文中;
解决方法:
第一步、创建ArgumentResolver 类
public class ArgumentResolver implements WebArgumentResolver {
@Override
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest nativeWebRequest) throws Exception {
Class<?> parameterType = methodParameter.getParameterType();
if (parameterType != null){
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
if (parameterType.equals(UserDO.class)){
// 如果数据对象是 userDO 则直接从 请求上下文中获取数据返回
return request.getAttribute("userData");
}
}
// 正常返回 请求数据
return UNRESOLVED;
}
}
第二步、创建拦截器类UserInterceptor
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 这里应该是 取 request.getHeaders 里面的token 取 userID 然后进行查询 返回 UserDO
UserDO userDO = ...;
//设置返回页面类型和编码
response.setContentType("text/html; charset=UTF-8");
if (userDO != null){
request.setAttribute("userData",userDO);
return true;
}
// 认证失败
response.sendRedirect(request.getContextPath() + "/passport/login");
return false;
}
}
第三步、创建配置类
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new ServletWebArgumentResolverAdapter(new ArgumentResolver()));
super.addArgumentResolvers(argumentResolvers);
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(new UserInterceptor());
// registration.excludePathPatterns(
//
// );
registration.addPathPatterns(
"/user/**",
"/passport/**"
);
super.addInterceptors(registry);
}
}
第四步、在controller中使用
@GetMapping(value = "/account")
public String account(
UserDO userDO
){
System.out.println("userData = " + userDO);
}
即可获取到相关数据


浙公网安备 33010602011771号