当前位置: 首页 > backend >正文

利用HandlerMethodArgumentResolver和注解解析封装用户信息和Http参数

获取用户身份信息详情注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 获取用户身份信息详情注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface CurrentUserPrincipal {/*** 是否允许匿名用户* @return*/boolean Anonymous() default false;
}

获取HTTP上下文注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 获取HTTP上下文注解** @author linpx* @date 2022/3/25 下午 6:27*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface CurrentHttpContext {}

接口HandlerMethodArgumentResolver

/** Copyright 2002-2014 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.springframework.web.method.support;import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;/*** Strategy interface for resolving method parameters into argument values in* the context of a given request.** @author Arjen Poutsma* @since 3.1* @see HandlerMethodReturnValueHandler*/
public interface HandlerMethodArgumentResolver {/*** Whether the given {@linkplain MethodParameter method parameter} is* supported by this resolver.* @param parameter the method parameter to check* @return {@code true} if this resolver supports the supplied parameter;* {@code false} otherwise*/boolean supportsParameter(MethodParameter parameter);/*** Resolves a method parameter into an argument value from a given request.* A {@link ModelAndViewContainer} provides access to the model for the* request. A {@link WebDataBinderFactory} provides a way to create* a {@link WebDataBinder} instance when needed for data binding and* type conversion purposes.* @param parameter the method parameter to resolve. This parameter must* have previously been passed to {@link #supportsParameter} which must* have returned {@code true}.* @param mavContainer the ModelAndViewContainer for the current request* @param webRequest the current request* @param binderFactory a factory for creating {@link WebDataBinder} instances* @return the resolved argument value, or {@code null} if not resolvable* @throws Exception in case of errors with the preparation of argument values*/@NullableObject resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;}

HTTP上下文参数解析器


import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;import javax.servlet.http.HttpServletRequest;/*** HTTP上下文参数解析器*/
public class HttpContextArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {return HttpContext.class.isAssignableFrom(methodParameter.getParameterType()) &&methodParameter.hasParameterAnnotation(CurrentHttpContext.class);}@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {return new HttpContext(nativeWebRequest.getNativeRequest(HttpServletRequest.class));}
}

用户身份信息参数解析器


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;/*** 用户身份信息参数解析器*/
public class UserPrincipalArgumentResolver implements HandlerMethodArgumentResolver {@Autowiredprivate UserPrincipalResolverService userPrincipalResolverService;@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {return BaseUserDetail.class.isAssignableFrom(methodParameter.getParameterType()) &&methodParameter.hasParameterAnnotation(CurrentUserPrincipal.class);}@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {CurrentUserPrincipal annotation = methodParameter.getParameterAnnotation(CurrentUserPrincipal.class);return userPrincipalResolverService.resolve(methodParameter.getParameterType(), annotation.Anonymous());}
}
http://www.xdnf.cn/news/1470.html

相关文章:

  • Postman设置了Cookies但是请求不携带Cookie
  • Java | 深拷贝与浅拷贝工具类解析和自定义实现
  • 今日行情明日机会——20250423
  • 协程gevent案例
  • 从代码学习深度学习 - 自动并行 PyTorch 版
  • AI飞行行为的可解释性与合规审计机制设计
  • React SSR + Redux 导致的 Hydration 报错踩坑记录与修复方案
  • 亚信安全与联通数科达成战略合作,成立联信事业部
  • 深入学习Axios:现代前端HTTP请求利器
  • flex修改主轴方向
  • 深入理解指针(2)
  • git提交
  • ctfhub-RCE
  • CDN加速http请求
  • 腾讯秋招面试题:bug生命周期中有哪些状态?
  • rl中,GRPO损失函数详解。
  • 需求质量验证-测试需求
  • GitLab_密钥生成(SSH-key)
  • 思科路由器密码绕过+重置
  • Vue 3中如何封装API请求:提升开发效率的最佳实践
  • Reactor编程模型介绍
  • Vue3 小功能记录:密码的显示与隐藏功能
  • WebXR教学 05 项目3 太空飞船小游戏
  • Synternet数据流正式上线Google Cloud Web3
  • FreeRTOS深度解析:队列集(Queue Sets)的原理与应用
  • Alertmanager的安装和详细使用步骤总结
  • 【锂电池剩余寿命预测】CNN卷积神经网络锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 大模型RAG的召回模式
  • Vite vs Webpack 优势对比
  • 抱佛脚之学SSM六