Nutz+JWT实现登录

发布于 2019-05-04  42 次阅读


最近在做一个微信小程序的项目,对于登录方案,再三考虑后选择了JWT的方式。用完后在此记录下使用方法。

创建JwtUtils

public class JwtUtils {

    public static SecretKey generalKey(){
        byte[] key= Base64.decode("********");
        return new SecretKeySpec(Base64.encodeToByte(key,false), "DES");
    }

    public static String generate(int uid) throws Exception {
        Map<String, Object> claims = new HashMap<String, Object>();
        SecretKey key = generalKey();
        JwtBuilder builder = Jwts.builder()
                .setId(UUID.randomUUID().toString())
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setSubject(String.valueOf(uid))
                .signWith(SignatureAlgorithm.HS256, key)
                .setExpiration(new Date(System.currentTimeMillis() + 7 * 24 * 3600 * 1000));
        return builder.compact();
    }

    public static Claims parse(String jwt) throws Exception {
        SecretKey key = generalKey();
        return Jwts.parser()
                .setSigningKey(key)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

在登录函数中返回jwt

return re.setv("code",0).setv("token",JwtUtils.generate(user.getUid()));

在MainModule中增加一个重新登录的入口函数

    @At("/relogin")
    public Object relogin(){
        NutMap re=new NutMap();
        return re.setv("code",666).setv("msg","登录失败请重新登录");
    }

创建过滤器

public class JwtFilter implements ActionFilter {
    @Override
    public View match(ActionContext actionContext) {
        String token= actionContext.getRequest().getParameter("token");
        try {
            Claims claims= JwtUtils.parse(token);
            actionContext.getRequest().setAttribute("uid",Integer.parseInt(claims.getSubject()));
        } catch (Exception e) {
            e.printStackTrace();
            return new ServerRedirectView("/relogin");
        }
        return null;
    }
}

使用过滤器

在需要验证登录状态的入口函数前增加@Filters(@By(type = JwtFilter.class)),同时在函数参数中增加@Attr("uid")int uid即可获取用户编号