Java利用过滤器实现完善登录功能

作者:一切总会归于平淡 时间:2021-07-20 15:07:05 

1、问题引入

我们已经完成了后台系统的登录功能开发,但是目前还存在一个问题,就是用户如果不登录,直接访问系统首页面,照样可以正常访问。

很明显,上面这种情况并不合理,我们希望看到的效果应该是,只有登录成功后才可以访问系统中的页面,如果没有登录, 访问系统中的任何界面都直接跳转到登录页面。

2、解决思路

使用 过滤器或者 * 来实现,在过滤器、 * 中拦截前端发起的请求,判断用户是否已经完成登录,如果没有登录则返回提示信息,跳转到登录页面,那我这篇博客选择的是过滤器来实现这个效果。

Java利用过滤器实现完善登录功能

过滤器具体的处理逻辑如下:

A. 获取本次请求的URI

B. 判断本次请求, 是否需要登录, 才可以访问

C. 如果不需要,则直接放行

D. 判断登录状态,如果已登录,则直接放行

E. 如果未登录, 则返回未登录结果

如果未登录,我们需要给前端返回什么样的结果呢? 这个时候, 可以去看看前端代码是如何处理的,大家可以先看看我这里的前端是如何处理的。(每个前端处理方式都不一样,随机应变)

Java利用过滤器实现完善登录功能

这个是我们前端的 * ,这个 * 就是用来拦截我们服务端给页面上的响应的,一旦我们后端给前端响应之后,它就会执行下面的代码进行判断。

大家也可以看到它里面的if判断 ,如果我们后端给前端返回的数据是

res.data.code = 0 && res.data.msg='NOTLOGIN'

那它就会自动跳到登录界面。

3、代码实现

3.1 定义登录校验过滤器

首先我们创建一个过滤器 LoginCheckFilter 并实现 Filter 接口, 在doFilter方法中完成校验的逻辑。

/**
* @description: 检查用户是否已经完成登录
* @author: Jie
* @date: 2022/8/10 9:48
**/
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
   @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

}
}

注:

@WebFilter :用于将一个类声明为过滤器,filterName 指定过滤器的名称,urlPatterns :需要拦截的请求路径

首先我们要获取到 request 和 response 和请求路径,这三位后面都会用到。

Java利用过滤器实现完善登录功能

现在我们获取到了请求路径,就可以去判断哪些请求路径是需要进行处理的,因为在项目实际开发中,我们的项目中有些地方是不需要登录也能进行访问的,比如淘宝和京东的首页,大家不登陆也能访问吧,所以我们要将这些路径定义出来,如果用户访问的是这些路径,那么我们就直接放行,就不处理了。

Java利用过滤器实现完善登录功能

上面就是我定义不需要拦截的请求路径,相信大家看到了最后两个路径有些不一样,这里呢我们用的是通配符的方式。

通配符规则:

符号含义
?匹配一个字符
*匹配0个或多个字符
**匹配0个或多个目录/字符

但是现在有一个问题,比如我现在请求的是/backend/index.html ,这对不上呀!那该如何去匹配呢?

这个时候我们就要认识一个新的对象 AntPathMatcher 。

Java利用过滤器实现完善登录功能

现在我们通过这个路径匹配器,匹配一下这个请求过来的路径是否能匹配上我们定义不需要拦截的请求路径里的任意一项。

这里我们封装一个方法用来判断本次请求是否需要处理。

Java利用过滤器实现完善登录功能

这样我们在上面调用,然后判断一下是否需要处理,如果不需要处理,那就直接放行即可。

Java利用过滤器实现完善登录功能

反之就是需要判断是否需要登录,那我们如何判断用户是否登录呢?因为我是登录的时候将用户的信息存到session 里的 ,那这里我就是 从session 里 获取登录用户,如果能获取出来,就代表用户已经登录。

Java利用过滤器实现完善登录功能

如果用户没有登录我们就需要通过输出流方式向客户端页面响应数据。

Java利用过滤器实现完善登录功能

完整代码 :

package com.jie.reggjie.filter;

import cn.hutool.core.text.AntPathMatcher;
import com.alibaba.fastjson.JSON;
import com.jie.reggjie.common.R;
import lombok.extern.slf4j.Slf4j;

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

/**
* @description: 检查用户是否已经完成登录
* @author: Jie
* @date: 2022/8/10 9:48
**/
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
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;
       String requestURI = request.getRequestURI();
       log.info("拦截到请求,{}", requestURI);

//2、判断本次请求是否需要处理
       //定义不需要处理的请求路径
       String[] urls = new String[]{
               "/employee/login",
               "/employee/logout",
               "/backend/**",
               "/front/**"
       };
       boolean check = check(urls, requestURI);

//3、如果不需要处理,则直接放行
       if (check) {
           log.info("本次请求{}不需要处理", requestURI);
           filterChain.doFilter(request, response);
           return;
       }

//4、判断登录状态,如果已登录,则直接放行
       if (request.getSession().getAttribute("employee") != null) {
           log.info("用户已登录,用户id为:{}", request.getSession().getAttribute("employee"));
           filterChain.doFilter(request, response);
           return;
       }
       log.info("用户未登录");
       //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
       response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
       return;
   }

public boolean check(String[] urls, String requestURI) {
       for (String url : urls) {
           boolean match = PATH_MATCHER.match(url, requestURI);
           if (match) {
               return true;
           }
       }
       return false;
   }
}

3.2 开启组件扫描

需要在启动类上, 加上Servlet组件扫描的注解, 来扫描过滤器配置的@WebFilter注解, 扫描上之后, 过滤器在运行时就生效了。

Java利用过滤器实现完善登录功能

来源:https://blog.csdn.net/weixin_53041251/article/details/126826816

标签:Java,过滤器,登录
0
投稿

猜你喜欢

  • SpringBoot整合Mybatis,解决TypeAliases配置失败的问题

    2023-11-28 14:59:24
  • Java OOP三大特征之封装继承与多态详解

    2023-11-11 01:11:56
  • spring定义和装配bean详解

    2023-08-23 00:33:18
  • java设计模式之浅谈适配器模式

    2023-11-19 14:46:26
  • Java手写线程池的实现方法

    2023-10-30 12:50:03
  • java实现操作系统中的最佳置换Optimal算法

    2023-10-26 10:27:13
  • Swagger实现动态条件注入与全局拦截功能详细流程

    2023-11-23 13:41:05
  • 一文给你通俗易懂的讲解Java异常

    2021-12-20 14:40:56
  • C#中动态显示当前系统时间的实例方法

    2023-06-20 14:46:02
  • java实现将结果集封装到List中的方法

    2021-10-27 22:29:45
  • Spring创建Bean的生命周期详析

    2022-01-27 06:33:26
  • 一文看懂JAVA设计模式之工厂模式

    2023-11-27 02:30:54
  • Java jar打包工具使用方法步骤解析

    2023-07-01 12:26:47
  • Spring Security OAuth过期的解决方法

    2023-05-26 22:30:01
  • Flutter实现抽屉动画

    2023-06-18 01:49:19
  • C#封装的Sqlite访问类实例

    2022-04-28 15:38:13
  • 小白2分钟学会Visual Studio如何将引用包打包到NuGet上

    2022-01-14 10:25:53
  • Struts2拦截器 关于解决登录的问题

    2023-07-02 14:06:09
  • springcloud-gateway集成knife4j的示例详解

    2023-11-29 08:56:44
  • SpringBoot使用AOP+注解实现简单的权限验证的方法

    2022-07-29 00:59:09
  • asp之家 软件编程 m.aspxhome.com