[Java2023] Day12.12-通过过滤器完成登录校验

66 阅读1分钟

image.png

代码

  • 1.过滤器代码 (多余的过滤器, 注释掉@WebFilter即可)
package com.tlias.filter;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.util.StringUtil;
import com.tlias.pojo.Result;
import com.tlias.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {


    @Override // 拦截到请求之后调用, 多次
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;


        // 1.获取请求的URL
        String url  = req.getRequestURL().toString();
        log.info("请求的URL:{}", url);

        // 2.判断请求是否包含url, 如果包含直接放行
        if (url.contains("login")) {
            filterChain.doFilter(servletRequest, servletResponse);
            return; // 让代码不继续执行
        }

        // 3.获取请求头的信息
        String jwt = req.getHeader("token");

        // 4.判断令牌是否存在如果不存在返回错误(未登录)
        if (!StringUtils.hasLength(jwt)) {
            log.info("请求头token为空, 返回未登录信息");
            Result error = Result.error("NOT_LOGIN");

            // 手动转换 对象转Json
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }

        // 5.如果jtw存在,校验; 如果解析失败会抛出异常, 捕捉到之后返回登录失败
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            log.info("token校验失败, 返回未登录信息");
            Result error = Result.error("NOT_LOGIN");

            // 手动转换 对象转Json
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }

        // 6.放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("校验成功放行");
    }


}
  • 2.这里添加了一个pom依赖包
<!-- 阿里巴巴提供的对象转json   -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>
  • 3.这里再贴一下JwtUtils的代码, 虽然未修改, 值得关注的是, 解析失败会抛出异常
package com.tlias.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

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;
    }
}