自定参数解析器HandlerMethodArgumentResolver实现将用户token中的用户信息自动解析到controller中的方法的参数中

1.创建一个HandlerMethodArgumentResolver。

package com.ciih.axj.resolver;

import com.ciih.axj.model.UserPlus;
import com.ciih.axj.model.User;
import com.ciih.axj.myAnnotations.UserIn;
import com.ciih.axj.service.UserPlusService;
import com.ciih.axj.service.UserService;
import com.ciih.axj.util.EmptyUtils;
import com.ciih.axj.util.JwtTokenUtilPlus;
import com.ciih.axj.util.UserInfo;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
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.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

@Component
public class RequestUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Resource
    private UserService userService;
    @Resource
    private UserPlusService userPlusService;
    @Resource
    private HttpServletRequest request;

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(UserIn.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter,
                                  ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest,
                                  WebDataBinderFactory webDataBinderFactory) {
        String token = request.getParameter("Authorization");
        if (token == null) {
            token = request.getHeader("Authorization");
        }
        if (token == null) {
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if ("Authorization".equals(cookie.getName())) {
                        token = cookie.getValue();
                    }
                }
            }
        }

        Assert.notNull(token, "未检测到token");
        UserInfo userInfo = JwtTokenUtilPlus.parseToken001(token, com.ciih.axj.util.UserInfo.class);
        User user=userService.lambdaQuery().eq(User::getLoginName,userInfo.getUsername()).one();

        if(EmptyUtils.isNotEmpty(user)){
            user.setDistrictId(user.getOrgId());
            UserPlus one = userPlusService.lambdaQuery().eq(UserPlus::getCreNum, user.getCredNum()).one();
            if(EmptyUtils.isNotEmpty(one)){
                user.setUserPlus(one);
                user.setDistrictId(one.getOrgId());
            }
        }
        return user;
    }
}

2.在WebMvcConfigurer中注册解析器

package com.ciih.axj.config;

import com.ciih.axj.resolver.RequestUserHandlerMethodArgumentResolver;
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 WebConfig implements WebMvcConfigurer {
    @Resource
    private RequestUserHandlerMethodArgumentResolver requestUserHandlerMethodArgumentResolver;

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

3.实现自定义注解,作为解析参数的标志

package com.ciih.axj.myAnnotations;

import java.lang.annotation.*;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserIn {
}

4.在控制器中的方法里使用自动参数解析

package com.ciih.axj.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ciih.axj.model.User;
import com.ciih.axj.myAnnotations.CheckUserType;
import com.ciih.axj.service.UserService;
import com.ciih.axj.util.EmptyUtils;
import com.ciih.axj.util.ServiceResult;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.ApiOperation;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import com.ciih.axj.myAnnotations.UserIn;

/**
 * (User)表控制层
 *
 * @author zzw
 * @since 2021-07-23 13:23:06
 */
@RestController
@RequestMapping("user")
public class UserController extends BaseController {

    @Resource
    private UserService userService;


    @ApiOperation(value = "学校管理员-根据条件查人员列表", httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(name="page",value="页",dataType="int",required=true,paramType = "query"),
            @ApiImplicitParam(name="pageCount",value="行数",dataType="int",required=true,paramType = "query"),
            @ApiImplicitParam(name="userName",value="姓名",dataType="String",required=false,paramType = "query"),
            @ApiImplicitParam(name="phone",value="电话",dataType="String",required=false,paramType = "query"),
            @ApiImplicitParam(name="creNum",value="身份证号",dataType="String",required=false,paramType = "query"),
            @ApiImplicitParam(name="orgId",value="组织id",dataType="String",required=false,paramType = "query")
    })
    @PostMapping("/getUsers")
    @CheckUserType({"system"})
    public ServiceResult getUsers(HttpServletRequest request, @RequestParam Integer page,
                                  @RequestParam Integer pageCount, String userName, String phone, String creNum, String orgId, @UserIn User user){
        //1校验身份

        //2查询用户列表
        QueryWrapper<User> userQueryWrapper=new QueryWrapper<>();
        if(EmptyUtils.isNotEmpty(userName)){
            userQueryWrapper.lambda().eq(User::getUserName,userName);
        }
        if(EmptyUtils.isNotEmpty(phone)){
            userQueryWrapper.lambda().eq(User::getPhone,phone);
        }
        if(EmptyUtils.isNotEmpty(creNum)){
            userQueryWrapper.lambda().eq(User::getCredNum,creNum);
        }
        if(EmptyUtils.isNotEmpty(orgId)){
            userQueryWrapper.lambda().eq(User::getOrgId,orgId);
        }
        IPage<User> userIPage=userService.page(new Page<>(page,pageCount),userQueryWrapper);
        return ServiceResult.success(userIPage,request);
    }


}

这样就可以在controller层的方法参数里面 通过@UserIn User user 直接获取到user的对象,非常方便。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值