后端Web之登录校验(下篇)

目录

1.概述

2.过滤器Fliter

3.拦截器Interceptor


1.概述

Filter过滤器:在Web开发中,过滤器(Filter)是一种非常重要的组件,用于在请求到达目标资源(如Servlet或静态资源)之前或之后,对请求或响应进行预处理或后处理。

它是JavaWeb三大组件(Servlet、Filter. Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

Interceptor拦截器:Web开发中扮演着重要的角色,主要用于在请求到达Controller之前或之后执行一些操作。

 它是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的用来动态拦截控制器方法的执行。其作用是拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

2.过滤器Fliter

它的使用非常简单:1.定义Filter:定义一个类,实现Filter接口,并重写其三个方法。2.配置Filter: Filter类 上加@WebFilter注解,配置拦截资源的路径。引导类上加@ServletComponentScan开启Servlet组件支持。

执行流程:放行后访问对应资源,资源访问完成后,还会回到Filter中,接着执行放行后的逻辑

Filter可以根据需求,配置不同的拦截资源路径:

过滤器链:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了-一个过滤器链。执行顺序:注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。例如A开头的过滤器就比B开头的过滤器先执行。

登录校验过滤器:

思路:所有的请求拦截后,除了登录请求之外都需要校验令牌。有令牌, 且令牌校验通过(合法) 才可以放行执行业务操作,否则都返回未登录错误结果

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

//2.判断请求url中是否包含login,包含就是登录操作,放行
if (url.contains("login")){
    log.info("登录操作,放行");
    chain.doFilter(request,response);
    return;
}

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

//4.判断令牌是否存在、如果不存在、返回错误结果(未登录)
if(!StringUtils.hasLength(jwt)){
    1og.info("请求头token为空,返回未登录的信息");
    Result error=Result.error("NOT LOGIN");
    String notLogin =JSONObject.toJSONString(error)
    resp.getWriter().write(notLogin);
    return;
}


//5.解析token,如果解析失败,返回错误结果(未登录)
try {
    JwtUtils.parseJwT(jwt);    
} catch(Exception e){//jwt解析失败
    e.printstackTrace();
    log.info("解析令牌失败,返回错误信息");
    Result error=Result.error("NOT LOGIN");
    String notLogin =JSONObject.toJSONString(error)
    resp.getWriter().write(notLogin);
    return;
}

//6.放行
log.info("令牌合法,放行");
chain.doFilter(request,response);

3.拦截器Interceptor

使用:1.定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。注释@Component把这个拦截器交给IOC容器管理。

2.注册拦截器,注入刚刚定义的拦截器,通配符**拦截所有请求

拦截器可以根据需求,配置不同的拦截路径:也可以指定不拦截的路径

过滤器和拦截器的总体执行流程:

过滤器和拦截器的区别

  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
  • 拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只拦截Spring环境中的资源。

登录校验拦截器的流程和过滤器完全一致, 按照接口规范CV一下稍作改造就可以了。

//删去过滤器当中的doFilter方法
//放行改为return true,不放行改为return false即可,其他步骤同理
if (url.contains("login")){
    log.info("登录操作,放行");
    return true;
}
  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值