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;
    }


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


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

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

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

相关文章
|
1天前
|
Java 开发者 Spring
Java Springboot监听事件和处理事件
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解Spring Boot中的事件机制,并在实际开发中灵活应用,提高系统的可维护性和扩展性。
20 7
|
26天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
58 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
21天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
104 13
|
2月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
124 60
|
29天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
37 2
|
2月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
80 4
|
2月前
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
50 1
|
2月前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优