springboot在参数上自定义注解拦截请求以验证sign值[原]

1 NeedSignBody

package com.rosellete.iescp.visitor.config.resolver;

import java.lang.annotation.*;

/**
 * @author qinyuguan
 */
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NeedSignBody {
    boolean required() default true;
}

2 MyMethodArgumentResolver

package com.rosellete.iescp.visitor.config.resolver;

import org.springframework.core.MethodParameter;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
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;

@Component
public class MyMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        //如果参数是字符串类型,并且有NeedSignBody注解,则该请求参数必须带加签信息
        if (parameter.getParameterType().equals(String.class) && parameter.hasParameterAnnotation(NeedSignBody.class)) {
            //做一些必须带加签信息的数据值
            return true;
        }
        return false;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        NeedSignBody currentUserAnnotation = parameter.getParameterAnnotation(NeedSignBody.class);
        SecurityContext sc = SecurityContextHolder.getContext();
        Authentication auth = sc.getAuthentication();
        //LoginUser loginUser = (LoginUser) auth.getPrincipal();
        //Integer userId = loginUser.getId();
        return "ddd";
    }
}

3 ArgumentResolversWebConfig

package com.rosellete.iescp.visitor.config.webconfig;

import com.rosellete.iescp.visitor.config.resolver.MyMethodArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;
import java.util.List;

@Configuration
public class ArgumentResolversWebConfig implements WebMvcConfigurer {

    @Resource
    private MyMethodArgumentResolver userIdMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(userIdMethodArgumentResolver);
    }

}

4 ParameterController

package com.rosellete.iescp.visitor.config.resolver;

import com.rosellete.iescp.base.annotation.StdRequestMapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController("parameterController")
@RequestMapping("parameter")
public class MyParameterController {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @StdRequestMapping(value = {"/testResolver"}, method = {RequestMethod.POST})
    public String testResolver(@NeedSignBody String body) {
        return "abc";
    }

}

此时会自动判断body参数如果带了NeedSignBody注解,则可以自动做些事情

感觉空虚寂寞,只是因为你无所关注,无处付出。
原文地址:https://www.cnblogs.com/whatlonelytear/p/15032310.html