当前位置: 首页 > article >正文

java后端实现登录退出功能,并用过滤器验证

java后端实现登录功能,并用过滤器验证

登录,退出功能

登录,退出功能的逻辑思路:
	 * 1. 密码md5加密
     * 2. 根据用户名查询数据库
     * 3. 比对密码
     * 4. 查看状态
     * 5. 将员工的id存放到session
  • 代码实现
    @Slf4j  //输出日志方便调试
    @RestController
    @RequestMapping("/employee")
    public class EmployeeController {
    
        //把创建的接口注入进来
        @Autowired
        private EmployeeService employeeService;
        /**
         * 员工登录
         *
         * @param request
         * @param employee
         * @return 处理逻辑:
         * 1. 密码md5加密
         * 2. 根据用户名查询数据库
         * 3. 比对密码
         * 4. 查看状态
         * 5. 将员工的id存放到session
         *
         * 完善登录功能,使没有登录的用户不能随意访问一些特定的界面
         * 1. 过滤器实现 √
         *      1.1自定义过滤器
         *      1.2加入注解
         *      1.3完善过滤器的逻辑
         *          1.3.1获取本次请求的uri
         *          1.3.2判断本次请求是否需要处理
         *          1.3.3判断登录状态
         * 2. 拦截器
         */
    
    @PostMapping("/login")
    //将员工对象的id存储到session,以方便获取登录对象
    public R<Object> login(HttpServletRequest request, @RequestBody Employee employee){
        //1.密码加密处理
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());
    
        //2.根据用户输入名字,查数据库信息,根据页面提交的用户名username查询数据库,包装一个查询对象,
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername,employee.getUsername());
        Employee emp = employeeService.getOne(queryWrapper);
        //2.1 如果没有查询到就返回错误
        if(emp == null){
            return R.error("登录失败!");
        }
    
        //3.比对密码
        if(!emp.getPassword().equals(password)){
            return R.error("登录失败!");
        }
    
        //4.查看员工状态
        if(emp.getStatus()==0){
            return R.error("账号已禁用!");
        }
    
        //5.将用户id存放在session
        request.getSession().setAttribute("employee",emp.getId());
        return R.success(emp);
    }
    
    /**
     * 退出登录功能
     * @param request
     *
     * 需求分析:点击退出按钮像/employee/logout发送退出请求,请求方式为post
     * 代码开发:
     *  1. 创建controller,清理session中的用户信息
     *  2. 返回结果,页面跳转到登录姐界面
     * 功能测试
     */
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        //清理session中的用户信息
        request.getSession().removeAttribute("employee");
        return R.success("退出成功");
    }
    

验证登录功能

完善登录功能,使没有登录的用户不能随意访问一些特定的界面
逻辑:
     * 1. 过滤器实现 √
     *      1.1自定义过滤器
     *      1.2加入注解
     *      1.3完善过滤器的逻辑
     *          1.3.1获取本次请求的uri
     *          1.3.2判断本次请求是否需要处理
     *          1.3.3判断登录状态
     * 2. 拦截器(不详细说明)
  • 代码实现
    /**
     * 检用户是否已经完成登录,若没有则不可以进入特定的界面
     */
    @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;
    
            //1.获取到本次请求的uri
            String requestURI = request.getRequestURI();
    
            log.info("拦截到请求:{}",requestURI);
    
            //2.判断本次请求是否需要处理
            //定义一些不需要可以放行的路径
            String[] urls = new String[]{
                    "/employee/login",
                    "/employee/logout",
                    "/backend/**",
                    "front/**"
            };
            boolean check = check(urls,requestURI);
    
            if(check){
                log.info("本次请求请求{}不要处理!",requestURI);
            //3.如果不需要处理直接放行
            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;
    
    
    }
        /**
         * 检查本次请求是否需要放行
         * @param requestURI
         * @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;
    }
    
    }
    

http://www.kler.cn/news/148376.html

相关文章:

  • android trace文件的抓取与查看方法
  • 【Lidar】基于Python的点云数据下采样+体素显示
  • tauri中使用rust调用动态链接库例子(使用libloading库和libc库)
  • ubuntu22.04 arrch64版在线安装java环境
  • C语言-指针讲解(3)
  • 用通俗的方式讲解Transformer:从Word2Vec、Seq2Seq逐步理解到GPT、BERT
  • 人机交互3——多主题多轮对话
  • TOD和PPS精确时间同步技术
  • C#面向对象
  • 2023网络安全产业图谱
  • 02-Java集合之双列集合,如HashMap,Hashtable,Properties,TreeMap的底层结构
  • 人工智能技术发展漫谈
  • 【Linux】信号
  • 《2023全球隐私计算报告》正式发布!
  • C语言错误处理之“非局部跳转<setjmp.h>头文件”
  • python 爬虫之 爬取网站信息并保存到文件
  • C++初阶--String类的使用
  • TCP 传输可靠性问题
  • DMX512协议及对接口电路的分析
  • openssl版本号解析
  • HTML新手入门笔记整理:HTML基本标签
  • 【DevOps】SonarQube 指标解读
  • Vue3 实现elementPlus的table列宽调整和拖拽
  • 最新版灵沐V3.3微信资源类小程序源码支持流量主
  • C语言面试之旅:掌握基础,探索深度(面试实战之c语言关键词中篇)
  • 在Spring Boot中使用ECharts绘制数据图表
  • 智慧化工~工厂设备检修和保全信息化智能化机制流程
  • 火狐挂代理访问问题Software is preventing Firefox from safely connecting to this site
  • Blazor Table 实现获取当前选中行的功能
  • pdf加密文件解密(pdf文件解密小工具)