SpringBoot学习:整合shiro(rememberMe记住我后自动登录session失效解决办法)

2023-10-27

项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821

定义一个拦截器,判断用户是通过记住我登录时,查询数据库后台自动登录,同时把用户放入session中。

配置拦截器也很简单,Spring 为此提供了基础类WebMvcConfigurerAdapter ,我们只需要重写addInterceptors 方法添加注册拦截器。

实现自定义拦截器只需要3步: 

1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。

2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。

3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。

package com.sun.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

/**
 * Created by sun on 2017-3-21.
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    /**
     * 此方法把该拦截器实例化成一个bean,否则在拦截器里无法注入其它bean
     * @return
     */
    @Bean
    SessionInterceptor sessionInterceptor() {
        return new SessionInterceptor();
    }
    /**
     * 配置拦截器
     * @param registry
     */
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(sessionInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login","/permission/userInsert",
                        "/error","/tUser/insert","/gif/getGifCode");
    }

}
package com.sun.configuration;

import com.sun.permission.model.User;
import com.sun.permission.service.PermissionService;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by sun on 2017-4-9.
 */
public class SessionInterceptor implements HandlerInterceptor{
    private final Logger logger = Logger.getLogger(SessionInterceptor.class);
    @Resource
    private PermissionService permissionService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        logger.info("---preHandle---");
        System.out.println(request.getContextPath());
        Subject currentUser = SecurityUtils.getSubject();
        //判断用户是通过记住我功能自动登录,此时session失效
        if(!currentUser.isAuthenticated() && currentUser.isRemembered()){
            try {
                User user = permissionService.findByUserEmail(currentUser.getPrincipals().toString());
                //对密码进行加密后验证
                UsernamePasswordToken token = new UsernamePasswordToken(user.getEmail(), user.getPswd(),currentUser.isRemembered());
                //把当前用户放入session
                currentUser.login(token);
                Session session = currentUser.getSession();
                session.setAttribute("currentUser",user);
                //设置会话的过期时间--ms,默认是30分钟,设置负数表示永不过期
                session.setTimeout(-1000l);
            }catch (Exception e){
                //自动登录失败,跳转到登录页面
                response.sendRedirect(request.getContextPath()+"/login");
                return false;
            }
            if(!currentUser.isAuthenticated()){
                //自动登录失败,跳转到登录页面
                response.sendRedirect(request.getContextPath()+"/login");
                return false;
            }
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        logger.info("---postHandle---");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        logger.info("---afterCompletion---");
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot学习:整合shiro(rememberMe记住我后自动登录session失效解决办法) 的相关文章

随机推荐

  • nuxt:在静态模式或者服务端渲染,build.cache:true与build.extractCSS:true不兼容

    设置cache true在build配置 设置extractCSS true在build配置 跑 yarn nuxt generate 第一次它将正常工作并看起来应该 再跑yarn nuxt generate一次 它仍然可以正常工作 返回并
  • Ubuntu20.04分区方案

    本人电脑是500G 固态硬盘 2T 机械硬盘 我只装了Ubuntu一个系统 如果是双系统 可以将500G固态硬盘分成250G 250G两块 分别安装一个系统 大家可以根据自己电脑硬件配置进行调整 分区名称 选择分区 文件系统类型 空间大小
  • PCL学习(1)PCL初玩

    PCL学习 文章目录 PCL学习 toc 前言 安装 说明 一步步引导做例子 关于CMakeLists txt 具体实践 官网的例子 解释 参数 总结 前言 最近进行毕设论文的设计时 博主学习计算机相关学习的过程中 但是浏览中感觉PCL进行
  • 阿里云Linux服务器安装配置MongoDB,并用navicat连接

    一 下载并安装MongoDB 1 首先下载 MongoDB 并上传至服务器 2 下载完成后解压文件 tar zxvf mongodb linux x86 64 4 0 11 tgz 3 移动到安装目录 mv mongodb linux x8
  • IntelliJ IDEA使用_Debug操作

    文章目录 版本说明 图标和快捷键 查看变量 计算表达式 条件断点 多线程调试 版本说明 当前的IntelliJ IDEA 的版本是2021 2 2 下载IntelliJ IDEA ps 不同版本一些图标和设置位置可能会存在差异 但应该大部分
  • 【AcWing】827. 双链表

    双链表 实现一个双链表 双链表初始为空 支持5种操作 在最左侧插入一个数 在最右侧插入一个数 将第 k个插入的数删除 在 第 k个插入的数左侧插入一个数 在第 k个插入的数右侧插入一个数 现在要对该链表进行 M次操作 进行完所有操作后 从左
  • 计蒜客 17319 The Heaviest Non-decreasing Subsequence Problem

    Problem nanti jisuanke com t 17319 Meaning 给一个整数序列 s 每个数都有个权值 权值的计算方法是 s i lt 0 s i 的权值为 0 s i gt 10000 s i 的权值为 5 且 s i
  • tomcat配置SSL证书_tomcat配置https证书

    现在很多网站都采用了https 因为https比http安全 所以我们公司也把内网系统改成https访问 但是这个要怎么配置和申请证书呢 如果企业不缺钱的情况下申请购买SSL证书 当然也可以申请免费的ssl证书 我们公司就是申请免费的SSL
  • 使用ByteArrayOutputStream将数据写入本地文件

    使用ByteArrayOutputStream将数据写入本地文件 在一个项目中做一次性校验部分 需要将校验后数据写入表格后上传 巧的是 服务器Down了 作为一个新手实习生菜鸟 为了测试自己的代码和输出结果有没有毛病 在大神同事的指点下选择
  • 单片机RAM使用与优化

    一 单片机中会使用 RAM 的内容有 变量 数组 堆栈 中断向量表等 其中变量和数组是程序中定义的变量和数组 用于存储程序运行时需要的数据 堆栈用于保存函数调用和返回的地址和参数等信息 中断向量表用于存储中断服务程序的入口地址 RAM 的读
  • 几个cve漏洞库查询网站

    分享几个cve漏洞库查询网站 自己在工作中经常用到 阿里云漏洞库 https avd aliyun com nvd list tenable漏洞库 nessus https www tenable com cve search https
  • 使用Google Weather API查询天气预报

    Google Weather API 只支持美国地区使用邮政编码进行查询 例如 http www google com ig api hl zh cn weather 94043 94043 为 山景城 美国加州 的邮政编码 而除了美国以外
  • IntelliJ换行CRLF, LF, CR的解释和默认设置

    在window下开发有一个大坑 就是换行默认是CRLF 也就是回车换行 但是Linux下只有换行LF 这样代码提交后 会出现编译问题 所以最好的办法是在IntelliJ下设置默认为LF 首先我们先介绍CRLF LF和CR这三种东西 CR是M
  • Android RecyclerView 网格显示正方形元素

    使用recyclerView显示纵向滑动的网格列表 只需要设置 mListView setLayoutManager new GridLayoutManager context 4 其中第二个参数4代表一行显示4个元素 但是如果要让元素为正
  • 以太坊(一)——概述

    一 以太坊出现的原因 比特币的不足 交易速度慢 出块时间为10分钟 采用POW算法 拼的是计算机的算力 耗电量大 会释放大量的温室气体 仅仅完成了货币的去中心化 以太坊的解决方法 交易速度加快 出块时间为15秒 以太币为10分钟 采用POW
  • 跟着 Guava 学 Java 之缓存

    本文我们先介绍一些缓存的背景知识 以及内存缓存的流行开源库类实现 最后利用一些例子重点介绍下 Guava Cache 的缓存功能 背景 什么是缓存 在计算中 缓存是一个高速数据存储层 其中存储了数据子集 且通常是短暂性存储 这样日后再次请求
  • 数据结构——排序

    目录 一 排序算法的基本概念 1 1 排序算法的分类 1 1 1 内部排序 1 1 2 外部排序 二 插入排序 三 希尔排序 四 冒泡排序 五 快速排序 六 简单选择排序 七 堆排序 7 1 建立大根堆 7 2 基于大根堆进行排序 7 3
  • VS Code IDE 安装使用教程

    概念 VS Code Visual Studio Code 是一个轻量级但功能强大的源代码编辑器 可用于Windows macOS 和Linux 它内置了对 JavaScript TypeScript和Node js的支持 并具有丰富的扩展
  • opencv-python 实现鱼眼矫正 棋盘矫正法

    鱼眼矫正有很多的方法 比较常用的有 棋盘标定法 经纬度法 opencv自带鱼眼矫正算法 也就是第一种 棋盘矫正法 第一步 制作棋盘格 用A4纸打印一张棋盘格 固定到硬纸板上 然后用鱼眼镜头对着拍摄 保留拍到的图片 如下图所示 可以从不同角度
  • SpringBoot学习:整合shiro(rememberMe记住我后自动登录session失效解决办法)

    项目下载地址 http download csdn NET detail aqsunkai 9805821 定义一个拦截器 判断用户是通过记住我登录时 查询数据库后台自动登录 同时把用户放入session中 配置拦截器也很简单 Spring