记录一下 关于参数解析器 会话请求上下文注入数据所有 controller 均可接收

需求:需要在拦截器中 认证用户身份并且把用户 但是在控制器层需要到用户Dao的数据时 还得 去操作Dao或者 从session 中取,如果存在web无状态情况 即无session 时则需要把数据存入当前会话请求的上下文中;

解决方法:

第一步、创建ArgumentResolver 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
    }
 }

 第三步、创建配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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中使用

1
2
3
4
5
6
@GetMapping(value = "/account")
    public String account(
            UserDO userDO
    ){
        System.out.println("userData = " + userDO);
}

  即可获取到相关数据

 

posted @   浅笑19  阅读(160)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示