登录校验-Filter-登录校验过滤器

目录

思路

登录校验Filter-流程

步骤

流程图

登录校验Filter-代码

过滤器类

工具类

测试登录

登录接口功能请求

其他接口功能请求

前后端联调 


思路

  • 前端访问登录接口,登陆成功后,服务端会生成一个JWT令牌,并返回给前端,前端会将JWT令牌保存下来,在同一会话中共享JWT令牌信息,在访问其他功能接口时,前端会在请求头信息中存放JWT令牌信息,请求头的名称为token,过滤器Filter对请求实施统一拦截(登录请求不进行拦截,因为登录成功之后才会生成JWT令牌)并进行登录校验,如果JWT令牌存在并有效,Filter就会放行请求访问Web资源,否则返回错误信息。

登录校验Filter-流程

步骤

  • 获取URL
  • 判断请求中是否含有login,如果含有,说明是登录操作,放行
  • 获取请求头中令牌(token)信息
  • 判断令牌是否存在,如果不存在,返回错误结果(未登录)。
  • 解析token,如果解析失败,返回错误结果(未登录)
  • 放行

流程图

登录校验Filter-代码

过滤器类

  • package com.example.tlias.Filter;
    
    import com.alibaba.fastjson.JSONObject;
    import com.example.tlias.pojo.Result;
    import com.example.tlias.utils.JwtUtils;
    import jakarta.servlet.*;
    import jakarta.servlet.annotation.WebFilter;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.util.StringUtils;
    
    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 request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            // 1.获取请求URL地址
            String url = request.getRequestURI().toString();
            log.info("获取到的URL地址为:{}", url);
    
            // 2.判断URL是否含有login路径,如果含有,则为登陆操作,放行
            if (url.contains("login")) {
                log.info("此请求为登陆操作,放行.......");
                filterChain.doFilter(request, response);
                return; //  todo 跳出过滤器
            }
            // todo 以下是对于不是登录操作的过滤
            // 3.获取请求头中的令牌(token)
            String token = request.getHeader("token");
    
            // 4.判断是否存在,如果不存在,返回错误结果(未登录)
            if (!StringUtils.hasLength(token)) {
                log.info("请求头token为空,返回为登录的信息");
                Result error = Result.error("NOT_LOGIN"); // 返回的错误信息通过接口文档与前端统一
                // todo 手动转换 将对象-->json格式数据===》可以使用阿里巴巴fastJson的工具包,在pom.xml配置文件中添加相关依赖
                // todo 控制类返回的对象会自动转换为JSON格式的字符串数据
                String noLogin = JSONObject.toJSONString(error);
                // 将数据写入响应对象
                response.getWriter().write(noLogin);
                return; // todo 跳出过滤器
            }
    
            // 5.解析token,如果解析失败,返回错误结果(未登录)
            try {
                JwtUtils.parseJWT(token);  // todo 如果解析失败方法就会报错
            } catch (Exception e) {  // token解析失败
                e.printStackTrace();
                log.info("解析令牌失败,返回未登录的错误信息");
                Result error = Result.error("NOT_LOGIN");
                String noLogin = JSONObject.toJSONString(error);
                response.getWriter().write(noLogin);
                return;
            }
            // 6.放行
            log.info("令牌合法,放行");
            filterChain.doFilter(request, response);
        }
    }
    

工具类

  • package com.example.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;
        }
    }
    

测试登录

  • 使用postman发送请求
    • 登录接口功能请求
      • 登陆成功(返回登录成功信息及令牌信息)
      • 登陆失败(返回登录失败信息)

    • 其他接口功能请求
      • 未登陆成功访问其他接口功能

        • ​​​​

      • 登陆成功访问其他接口

前后端联调 

Nginx项目压缩包地址如下:

https://hkm-web.oss-cn-beijing.aliyuncs.com/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3

运行及如果如下:

现在启动项目后会自动跳转到登陆界面,而不是和以前一样直接进入登陆后的界面

 成功登录后就可以进入登陆后的界面

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以先实现一个简单的Filter,用来校验用户的登录状态和权限,具体的实现步骤如下:1. 实现一个Filter类,实现Filter接口,覆盖doFilter方法,在方法中实现用户登录校验和权限校验的逻辑。2. 配置web.xml文件,配置Filter和要校验的URL,同时配置Filter的初始参数,如登录页面URL等。3. 创建一个Filter实例,并将其配置到web.xml文件中,完成Filter的配置。4. 启动服务器,Filter就会根据web.xml文件中的配置,实现用户登录校验和权限校验的功能。 ### 回答2: 用户登录校验和权限校验是Web应用开发中非常常见的功能之一。在Java Web应用中,可以使用原生Java编写Filter实现这个功能。 FilterJava Servlet规范提供的一种组件,可以对请求进行拦截和处理。下面是一个用原生Java编写的登录校验和权限校验Filter的示例: 首先,需要创建一个类来实现Filter接口,并重写其doFilter方法,该方法将在每一个请求被执行时被调用。在doFilter方法中,我们可以对请求进行相关的校验和处理。 ```java public class AuthenticationFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 进行用户登录校验 boolean isLoggedIn = checkUserLoggedIn(httpRequest); if (!isLoggedIn) { httpResponse.sendRedirect("/login"); // 未登录则跳转到登录页面 return; } // 进行权限校验 boolean hasPermission = checkUserPermission(httpRequest); if (!hasPermission) { httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied"); // 没有权限则返回403错误 return; } chain.doFilter(request, response); // 放行请求 } // 校验用户是否已登录 private boolean checkUserLoggedIn(HttpServletRequest request) { // 实现具体的登录校验逻辑,比如判断Session中是否存在登录信息 // 返回一个boolean值表示是否已登录 } // 校验用户是否有权限访问资源 private boolean checkUserPermission(HttpServletRequest request) { // 实现具体的权限校验逻辑,比如判断用户角色是否具备访问权限 // 返回一个boolean值表示是否有权限 } } ``` 然后,在web.xml文件中配置该Filter,指定需要被该Filter拦截的URL模式: ```xml <filter> <filter-name>AuthenticationFilter</filter-name> <filter-class>com.example.AuthenticationFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthenticationFilter</filter-name> <url-pattern>/*</url-pattern> // 拦截所有URL </filter-mapping> ``` 以上代码是一个简单的示例,实际应用中可能需要根据具体需求进行一些调整和优化。这个Filter可以在用户每次请求时拦截并进行用户登录校验和权限校验,从而实现这两个功能的自动化处理。 ### 回答3: 要用原生Java写一个Filter实现用户登录校验和权限校验,可以按照以下步骤进行实现: 1. 创建一个Java类,命名为LoginFilter实现javax.servlet.Filter接口。 2. 在LoginFilter类中,实现doFilter方法,该方法接收三个参数:ServletRequest request, ServletResponse response, FilterChain chain。此方法会在每次请求前后被调用。 3. 在doFilter方法中,首先获取用户的登录信息,可以通过从request对象中获取session或者cookie等方式来获取。 4. 如果用户没有登录信息,则将请求重定向到登录页面,或者返回相应的错误提示,用于告知用户需要先登录才能访问页面。 5. 如果用户已经登录,则进一步校验用户的权限。可以通过获取用户的角色或者拥有的权限列表来进行校验。 6. 如果用户没有足够的权限,则同样将请求重定向到相应的错误页面,或者返回相应的错误提示。 7. 如果用户通过了登录和权限的校验,可以通过调用chain.doFilter(request, response)方法,继续执行其他Filter或者Servlet。 8. 最后,需要将LoginFilter类配置在web.xml文件中,以便让容器在每个请求过程中都能调用该过滤器。 通过以上步骤,我们就可以通过原生Java写一个Filter实现用户登录校验和权限校验。当用户请求一个需要登录和权限的页面时,该Filter会进行相应的校验,并根据校验结果决定是否允许用户访问页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值