栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot实现参数解析基于注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot实现参数解析基于注解

      我们都知道SpringMvc的Controller的方法上可以接收各种各样的参数,比如HttpServletRequest或HttpServletResponse,各种注解@RequestParam、@RequestHeader、@RequestBody、@PathVariable、@ModelAttribute,这些参数是从哪里获取的?

这些参数都是由不同的参数解析器为我们解析出来的,可以解析类也可以解析带注解的类

我们可以利用解析器解析自定义的参数(类、注解),在我们需要的传入的controller方法上传入它(不需要每次都要在方法内部通过request、response等参数做一系列操作来获取该类对象)

1、编写注解类
@Target(value = ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface LoginUser {
}
2、添加解析器配置类

我们想要解析参数的时候我们就需要通过更改SpringBoot的配置来添加自己实现的解析类自定义配置类实现WebMvcConfigurer接口,重写其中的addArgumentResolvers方法来添加自己的解析类(通过自动注入的方法注入)

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    SpringSSOInterceptor springSSOInterceptor;

    @Autowired
    LoginUserPinArgumentResolver loginUserPinArgumentResolver;
    
    @Autowired
    UserAuthCheckInterceptor userAuthCheckInterceptor ;

   
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(springSSOInterceptor).addPathPatterns("
    @Override
    public void addArgumentResolvers(List argumentResolvers) { 
         argumentResolvers.add(loginUserPinArgumentResolver);
    }
}

3、实现解析器

我们自定义解析器需要实现HandlerMethodArgumentResolver处理器方法解析器接口,并实现其中的supportsParameter和resolveArgument方法

HandlerMethodArgumentResolver的接口定义如下:

(1)supportsParameter 用于判断是否支持对某种参数的解析(支持则返回true)

(2)resolveArgument 将请求中的参数值解析为某种对象(具体的操作获取解析对象)

下面这个解析器用于获取User对象(通过token获取保存在redis中的user),无需每次使用resquest和response在controller方法内部获取,可以直接获取到作为参数传入

@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {

    @Autowired
    private UserService userService;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(LoginUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);
        assert request != null;
        //cookie_NAME_TOKEN="token"
        String paramToken = request.getParameter(UserServiceImpl.cookie_NAME_TOKEN);
        String cookieToken = getcookievalue(request); 

        //通过两种方式获取,如果都获取失败则返回null
        if(StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)){
            return null;
        }else {
            String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
            return userService.getUserByToken(response,token);
        }
    }

    //遍历cookie获取名称相同的那个cookie的值
    private String getcookievalue(HttpServletRequest request) {
        cookie[] cookies = request.getcookies();
        for(cookie cookie:cookies){
            if(cookie.getName().equals(Constant.cookie_NAME_TOKEN)){
                return cookie.getValue();
            }
        }
        return null;
    }
}

到此,一个注解参数解析器就实现好了,我们可以通过传入参数的形式直接通过解析器帮我们获取到

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/490013.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号