java 基于SpringBoot Session拦截器实现登陆功能

简介: java 基于SpringBoot Session拦截器实现登陆功能

本人新手,不足之处,请谅解。 有不足之处,欢迎提出。


下面开始给大家介绍具体的实现:

先说下具体用到的几个类:

1.在这里先给大家说下Session的主要内容( 检查session登陆的信息,判断是否是首页登陆,(是则通过,不是跳转登陆页面)判断是否是ajax的请求,是则直接放行)


HandlerInterceptor :SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理

preHandle:方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用。

postHandle:postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操作。

afterCompletion:调用前提:preHandle返回true,调用时间DispatcherServlet进行视图的渲染之后


下面我来贴出具体代码

package com.example.admins.system;
import com.example.admins.Bean.UserBean_a;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @describe Session拦截器
 */
public class SessionInterceptor implements HandlerInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(SessionInterceptor.class);
    /**
     * 检查session中的登录信息,区别ajax
     */
    @Override                                      //获取请求 和发送请求到服务器中   定义类的名称
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取类的名称  赋值给requestURI  参数 进行相关的调用
        String requestURI = request.getRequestURI();
        //在控制台输出  获取到的所有的相关的路径
        LOGGER.info("Session 检查,请求 URI:" + requestURI);
        // 再次获取参数赋值给uri的问题
        String uri = request.getRequestURI();
        //判断非空
        if (uri != null) {
            //todo 判断是否的登陆的首页  登陆则通过
            //String类型有一个方法:contains(),该方法是判断字符串中是否有子字符串。如果有则返回true,如果没有则返回false。  page/login是我的登陆页面
            if (uri.contains("/page/login")) {// 登录请求直接放行 对于某些不需要验证的uri可以特殊处理
                return true;
            }
            //todo 判断是否已经登录    此处的("user") 是登陆中获取的,判断是否登陆
            UserBean_a member = (UserBean_a) request.getSession().getAttribute("user");
            if (member == null) {
                if (isAjax(request)) {
                    LOGGER.info("是ajax请求");
                    //指定格式防止乱码
                    response.setHeader("Cache-Control", "no-cache");
                    response.setHeader("Content-Type", "text/json;charset=utf-8");
                    response.setCharacterEncoding("UTF-8");
                } else {
                    //重定向页面 如果没有登录就跳转到登录页面   page/login是我的登陆页面
                    response.sendRedirect(request.getContextPath() + "/page/login");
                    //停止 运行
                    return false;
                }
            }
        }
        //继续 运行
        return true;
    }
    /**
     * 处理成功才进入post处理
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //LOGGER.info(">>>>>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
    }
    /**
     * 处理完后进入,不论是否抛除异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //LOGGER.info(">>>>>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
    }
    /**
     * @param request
     * @return
     * @describe 判断是否是ajax请求
     */
    private boolean isAjax(HttpServletRequest request) {
        String xrw = request.getHeader("X-Requested-With");
        if ("XMLHttpRequest".equalsIgnoreCase(xrw)) {
            return true;
        }
        return false;
    }
}


2.下面我来给大家介绍,拦截器的主要类

这个类的位置也很关键,请大家注意,这是我遇到的坑


代码贴上:

package com.example.admins;
import com.example.admins.system.SessionInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
//放在主类上不包括其他东西
//WebMvcConfigurerAdapter这个类,重写这个类中的方法可以让我们增加额外的配置
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
//addResourceLocations指的是文件放置的目录
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 多个拦截器组成一个拦截器链 
        registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
    }
//addResoureHandler指的是对外暴露的访问路径 此处一般默认即可
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 静态资源拦截器
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }
}


我说下我在这个类中遇到的坑:excludePathPatterns("/static/**"); 是放行本类中的一些css/js 等样式,大家在此处应该注意下: 1.是不是所有的样式在static中 2.直接贴图,

确认页面的样式是不是从static 中进去 如果不是他可能会把你的样式进行拦截。此处是本人的坑,希望大家注意;


3.最后我来说下:登陆中对此类的应该 控制台的登陆代码

贴代码:

此处的 User 是我们在第一条 登陆判断的时候的 User ,他从控制台获取登陆的数据,来判断你是否登陆

登录成功之后将用户信息保存到session里

session.setAttribute(“user”, userBean1);

//登陆
    @RequestMapping(value = "/index")
    @ResponseBody
    public String lo(UserBean_a userBean, HttpSession session) {
        System.out.println("------------控制台前端输入的获取的账号输入的" + userBean.getUsername());
         UserBean_a userBean1 = userService.userLogin(userBean);
        System.out.println("------------userBean1的账号" +userBean1);
        if (userBean1 != null) {          
            System.out.println(userBean1);
            log.debug("用户登陆成功--{}", JSONObject.toJSONString(userBean1));
            // 登录成功之后将用户信息保存到session里
            session.setAttribute("user", userBean1);
            /* System.out.println(md5Pass);*/
            return userBean1.toString();
        }
        log.debug("用户登陆失败--{}", JSONObject.toJSONString(userBean1));
        return null;
    }


这样就完成了登陆拦截请求。


一个新手、没背景的野鸡大学挣脱出来的野小子,主要以不断

学习,不断记录,用思维认知去看这个世界。写作、阅读、分享,用独自的思考和感悟分享给互联网里的每一位技术人。

不爱学习的我们,无力的挣扎吧!

相关文章
|
8天前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
24 2
|
26天前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
60 1
|
1月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
87 1
|
2月前
|
Arthas 存储 监控
Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
99 8
|
1月前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
117 0
|
1月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
128 0
|
1月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
192 0