如何预处理controller中RequestMapping注解的方法的入参?将token转成user传入方法

前端访问的请求头headers中携带了token,如何将token转成user传入我的这个方法中呢?
如下是我想要的结果:
User user就是token转成的user,

@PostMapping("add")
@ResponseBody
public Comment commentAdd(@RequestBody CommentAddVO VO, User user) {
    Comment comment =  comRep.save(VO.toComment(user));
    //获取所有说说
    return comment;
}

应该怎么做呢?

我现在的写法是弄了一个静态方法,获取当前请求中的token,再把token转成user通过方法返回,如下:

public static String getUserName() {
    //获取到当前线程绑定的请求对象
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
    String cookieToken =CookieUtils.getCookie(request,"token");
    System.out.println("cookieToken:" + cookieToken);

    String headerToken = request.getHeader("token");
    System.out.println("headerToken:" + headerToken);
    return headerToken;
}

但我觉得这样不如直接将 token转成user放到方法入参中简单,所以想请教一下怎么做比较好

或者如何将头请求放到方法入参中?

阅读 4.1k
3 个回答

如果是要取header里的数据,用RequestHeader,用法类似RequestParam

大哥,你都拿到token了,再把token按照你们系统的转化规则转化为user对象返回即可。

第一种:

@PostMapping("add")
    @ResponseBody
    public Comment commentAdd(@RequestBody CommentAddVO VO, HttpServletRequest request) {
        String headerToken = request.getHeader("token");       
        User user = .....;//把token转化为为user对象
         Comment comment =  comRep.save(VO.toComment(user));
        //获取所有说说
        return comment;
    }

如果你嫌这种麻烦,你可以写基础的controller,比如类名是BaseController。你的controller继承这个BaseController,把获取user逻辑写个方法放在BaseController中,用到user的时候调用一下就可以了。

第二种:用你的UserUtil

public class UserUtil {
    
    public static User getUser() {
        //获取到当前线程绑定的请求对象
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        String headerToken = request.getHeader("token");
        User user = .....;//把token转化为为user对象
        return user;
    }
}

@PostMapping("add")
    @ResponseBody
    public Comment commentAdd(@RequestBody CommentAddVO VO) {
        String headerToken = request.getHeader("token");       
        User user = UserUtil.getUser();
         Comment comment =  comRep.save(VO.toComment(user));
        //获取所有说说
        return comment;
    }

第三种:如果一定要按照你的方式,传入user对象。
就按照上面老兄说的,自己写个过滤器或者拦截器获取下token,然后转化为user对象,然后放到request中去。

如果有用到spring security,可以使用@AuthenticationPrincipal注解达到这种效果。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题