其他分享
首页 > 其他分享> > 记录一下 关于 回话请求上下文注入数据所有 controller 均可接收

记录一下 关于 回话请求上下文注入数据所有 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);
}

  即可获取到相关数据

 

标签:return,回话,request,userDO,class,UserDO,controller,上下文,public
来源: https://www.cnblogs.com/qianxiaoPro/p/14200970.html