记录一下 关于参数解析器 会话请求上下文注入数据所有 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); } |
即可获取到相关数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)