JWT 复习 +过滤器 +拦截器

1JWT 拦截器 实现登录

1.jwt代码

结构
签名算法 原文(base64编码) 用密钥和签名算法对原文计算得到的签名

载荷里面记录的是含有三大声明,注册声明:iss(发行者)、exp(到期时间)、sub(主题)、sub(受众)。公开声明、私有声明,这三个声明都是非必要的,如果不声明,载荷里面也会自动生成数据代替载荷。

public class JWT {
private static String signKey = "xiaoyu";
private static long expire = 3600000; // 设置一个小时的过期时间,单位为毫秒

public static String returnJwt(Map<String, Object> claims) {
    String jwt = Jwts.builder()
            .setClaims(claims)//原文
            .signWith(SignatureAlgorithm.HS256, signKey)//签名算法 +密钥
            .setExpiration(new Date(System.currentTimeMillis() + expire))//设置国企时间
            .compact();//设置为字符串
    return jwt;
}

public static Claims parseJWT(String jwt) {
    Claims claims = Jwts.parser()
            .setSigningKey(signKey)//设置签名密钥
            .parseClaimsJws(jwt)//验证签名是否有效
            .getBody();//getBody方法将返回JWT中的声明部分,也就是payload,作为Claims对象的实例。
    return claims;
}
}

无标题

2.拦截器和过滤器

//拦截器
@Component
public class interceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String url=request.getRequestURI();
///2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
        if(url.contains("/login"))
        {
            //放行

            return true;
        }
//3.获取令牌
        String token=request.getHeader("token");
//4.判断令牌是否存在
        if(StringUtils.isEmpty(token))
        {
            Result error=Result.error("NOT_LOGIN");
            String not= JSONObject.toJSONString(error);
            response.getWriter().write(not);
            return false;
        }
//解析TOKEN
        try{
            JWT.parseJWT(token);
        }catch (Exception e)
        {
            Result error=Result.error("NOT_LOGIN");
            String not= JSONObject.toJSONString(error);
            response.getWriter().write(not);
            return false;
        }



        return true;
    }
}

过滤器

@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    //路径匹配器,支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest)  servletRequest;
        HttpServletResponse response=(HttpServletResponse)servletResponse;
        //1.获取请求url
        String url=request.getRequestURI();
        //2.定义不需要拦截的路径
        //1.所有静态资源  包括登录验证 包括退出
        String[] urls=new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**",
                "/user/login",
                "/user/sendMsg",
                "/doc.html",
                "/webjars/**",
                "/swagger-resources",
                "/v2/api-docs"
        };
        ///3.请求url中是否需要被处理 --我们需要一个可以判断url是否有其中关键词的
        boolean check=check(urls,url);
        if(check)
        {
            //放行
            filterChain.doFilter(request,response);
            return;
        }
        //4.有敏感操作的路径 --判断seeion
        if(request.getSession().getAttribute("employee")!=null)
        {
            Long empId = (Long) request.getSession().getAttribute("employee");
            BaseContext.setCurrentId(empId);
            filterChain.doFilter(request,response);
            return;
        }

        //4.有敏感操作的路径 --判断seeion
        if(request.getSession().getAttribute("user")!=null)
        {
            Long userId = (Long) request.getSession().getAttribute("user");
            BaseContext.setCurrentId(userId);
            filterChain.doFilter(request,response);
            return;
        }
        //前端接受响应对数据进行判断
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

    }
    //进行路径匹配的函数
    public  boolean check(String[] urls, String url)
    {
        for(String urll:urls)
        {
            boolean match=PATH_MATCHER.match(urll,url);
            if(match)
            {
                return  true;
            }
        }

        return false;
    }

}

  1. 在Java Web开发中,过滤器是Servlet规范中的一部分,它可以对HTTP请求进行拦截和处理。过滤器可以在请求进入Servlet之前对请求进行预处理,也可以在响应返回给客户端之前对响应进行后处理。过滤器是基于回调函数的方式实现的,可以通过配置在web.xml文件中来添加和配置过滤器。
  2. 拦截器通常是在框架层面上的概念,在Spring等框架中比较常见。拦截器也可以对请求进行预处理和后处理,但它更多地与框架的执行链(如Spring MVC的执行链)相关联。拦截器可以对方法的调用进行拦截和处理,例如在方法执行前进行一些操作,在方法执行后进行一些操作等。
  3. 另外,从使用方式上来说,过滤器是基于函数回调的形式实现的,而拦截器通常是基于面向切面编程(AOP)的方式实现的。
posted @ 2023-11-14 12:36  大橘|博客  阅读(60)  评论(0)    收藏  举报