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


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


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

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

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

相关文章
|
27天前
|
缓存 前端开发 Java
【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】
【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】
|
21天前
|
Java 测试技术
SpringBoot整合单元测试&&关于SpringBoot单元测试找不到Mapper和Service报java.lang.NullPointerException的错误
SpringBoot整合单元测试&&关于SpringBoot单元测试找不到Mapper和Service报java.lang.NullPointerException的错误
21 0
|
26天前
|
Java 测试技术 数据库
基于SpringBoot+HTML实现登录注册功能模块
基于SpringBoot+HTML实现登录注册功能模块
|
21小时前
|
分布式计算 DataWorks 监控
DataWorks操作报错合集之DataWorks在调用java sdk的createFile功能时报错com.aliyuncs.exceptions.ClientException: 1201111000 如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
9 1
|
4天前
|
缓存 Java 测试技术
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
|
5天前
|
Java API
java流式实现chatGPT会话功能
java流式实现chatGPT会话功能
8 1
|
6天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
12天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
156 10
|
12天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
13天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
37 6