spring boot ----登录标记

过滤器

 

 @ServletCompinentScan表示这个类支持servlet

@Slf4j
@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {
    @Override//初始化方法 只调用一次
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override//拦截到请求之后调用
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req= (HttpServletRequest) servletRequest;
        HttpServletResponse resp= (HttpServletResponse) servletResponse;

        //获取请求url
        String url =req.getRequestURI().toString();
        //uri是否包含login
        if(url.contains("login")){
            log.info("登录操作");
            filterChain.doFilter(req,resp);
            return;
        }
        //获得令牌
        String jwt=req.getHeader("token");
        //判断令牌是否存在
        if(!StringUtils.hasLength(jwt)){
            log.info("请求头为空,返回未登录");
            Result error=Result.error("NOT_LOGIN");
            String  notLogin= JSON.toJSONString(error);//转换成JSON格式
            resp.getWriter().write(notLogin);
            return;
        }
        //解析jwt
        try{
            JwtUtils.parseJWT(jwt);
        }catch(Exception e){
            e.printStackTrace();
            log.info("解析失败");
        }
        //放行
        log.info("令牌合法,方行");
        filterChain.doFilter(req,resp);
    }

    @Override//销毁方法,只调用一次
    public void destroy() {
        Filter.super.destroy();
    }
}

 过滤器链

 拦截器

概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制器方法的执行。

作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

 

@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
        //目标资源方法执行前执行,放回true:放行,返回false:不放行
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        //获取请求url
        String url =req.getRequestURI().toString();
        //uri是否包含login
        if(url.contains("login")){
            log.info("登录操作");
            return true;
        }
        //获得令牌
        String jwt=req.getHeader("token");
        //判断令牌是否存在
        if(!StringUtils.hasLength(jwt)){
            log.info("请求头为空,返回未登录");
            Result error=Result.error("NOT_LOGIN");
            String  notLogin= JSON.toJSONString(error);//转换成JSON格式
            resp.getWriter().write(notLogin);
            return false;
        }
        //解析jwt
        try{
            JwtUtils.parseJWT(jwt);
        }catch(Exception e){
            e.printStackTrace();
            log.info("解析失败");
            return false;
        }
        //放行
        log.info("令牌合法,方行");
        return true;
    }
        //目标资源方法执行后执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
        //视图渲染完毕后执行,最后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

配置拦截 器

@Configuration//配置类
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}

 拦截路径

 执行流程

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值