登录校验-统一拦截

文章展示了如何在JavaSpringBoot应用中使用Maven依赖jjwt来实现JWT(JSONWebToken)的生成和解析。在utils工具类中,定义了生成和解析JWT的方法,并在controller层处理登录时生成JWT。同时,文章还描述了一个filter过滤器的实现,用于检查请求头中的JWT令牌,确保其存在且合法,否则返回错误信息。
摘要由CSDN通过智能技术生成

 

maven依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

utils工具类

public class JwtUtils {

    private static String signKey = "itheima";
    private static Long expire = 43200000L;

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

 controller层使用

@PostMapping("/login")
public Result login(@RequestBody Emp emp){
    log.info("登录所需的信息:{}",emp);
   Emp e= empService.login(emp);
   //登录成功
    if (e!=null){
        Map<String, Object> claims=new HashMap<>();
        claims.put("id",e.getId());
        claims.put("username",e.getUsername());
        claims.put("name",e.getName());
        String jwt = JwtUtils.generateJwt(claims);
        return Result.success(jwt);
    }
    //登录失败
   return Result.error("用户名或密码错误");
}

filter过滤器代码实现逻辑

HttpServletRequest req= (HttpServletRequest) servletRequest;
HttpServletResponse resp= (HttpServletResponse) servletResponse;
//1.获取请求路径
String url = req.getRequestURL().toString();

//2.判断请求头中是否包含login,如果包含,直接放行
if (url.contains("login")){
    log.info("请求路径为:{}", url);
    filterChain.doFilter(req,resp);
    return;
}

//3.获取请求中的令牌token
String token = req.getHeader("token");

//4.检验token是否存在,如果不存在,返回错误结果
if (!StringUtils.hasLength(token)){
    log.info("请求失败,token为空,返回未登录的信息",token );
    Result not_login = Result.error("NOT_LOGIN");
    String notLogin = JSON.toJSONString(not_login);
    resp.getWriter().write(notLogin);
    return;
}

//5.检验token,检验令牌是否合法,如果不合法,返回错误结果
try {
    JwtUtils.parseJWT(token);
} catch (Exception e) {
    e.printStackTrace();
    log.info("解析令牌失败,返回登录错误的信息");
    Result error = Result.error("NOT_LOGIN");
    String notLogin = JSON.toJSONString(error);
    resp.getWriter().write(notLogin);
    return;
}

//6.token合法,放行
log.info("令牌合法,放行");
filterChain.doFilter(req,resp);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值