SpringBoot登录用户权限拦截器「建议收藏」

SpringBoot登录用户权限拦截器「建议收藏」1.创建自定义拦截器类并实现HandlerInterceptor接口packagecom.xgf.online_mall.interceptor;importcom.xgf.online_mall.system.domain.User;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.Handler

大家好,又见面了,我是你们的朋友全栈君。

1. 创建自定义拦截器类并实现 HandlerInterceptor 接口

package com.xgf.online_mall.interceptor;

import com.xgf.online_mall.system.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;

@Slf4j
@Component
public class UserLoginAuthInterceptor implements HandlerInterceptor { 
   
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
   
        log.info(" ======== UserAuthInterceptor preHandle 登录权限拦截器拦截");
        User user = (User) request.getSession().getAttribute("loginUser");
        //未登录才判断,登录了直接放行
        if(user == null){ 
   
            //获取访问路径
            String address = request.getRequestURI();
            log.info("======== 拦截,访问路径 address : {}", address);
            response.sendRedirect(request.getContextPath() + "/login.html");
            return false;

            /*String address = request.getRequestURI(); log.info("======== 拦截,访问路径 address : {}", address); //不是登录或者注册页面,就直接跳转登录界面 if(!address.contains("login") && !address.contains("register")){ //强制到登录页面 response.sendRedirect(request.getContextPath() + "/login.html"); //设置为false,不访问controller return false; }*/
        }
        //其它模块或者已经登录,就直接放行
// log.info("======== 已登录 user = {}", user);
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
   
        log.info(" ===== UserAuthInterceptor postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
   
        log.info("==== UserAuthInterceptor afterCompletion");

        //记录日志 向文件里面写日志
        //获取服务器记录日志log文件所存放的目录位置 -- tomcat下的真实路径+log目录
        String logdir = request.getServletContext().getRealPath("log");
        //路径不存在就创建
        Path logdirPath = Paths.get(logdir);
        if(Files.notExists(logdirPath)){ 
   
            Files.createDirectories(logdirPath);
        }
        //目录存在就将数据[字符]写入 //存放日志的路径+文件名
        Path logfile = Paths.get(logdir,"userlog.log");
        //logfile.toFile() paths转换为File类型 true以追加的方式写入
        BufferedWriter writer = new BufferedWriter(new FileWriter(logfile.toFile(),true));

        //获取登录用户信息
        User user = (User)request.getSession().getAttribute("loginUser");
        //记录user信息,存入日志
        writer.write(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " >> " + user +"\r\n");
        writer.flush();
        writer.close();
    }

}

2. 创建WebMvcConfigurer接口实现类,注册并生效自定义的拦截器

import com.xgf.online_mall.constant.PathConstantParam;
import com.xgf.online_mall.interceptor.UserLoginAuthInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

@Configuration
@Slf4j
public class LoginConfig implements WebMvcConfigurer { 
   
    @Autowired
    private UserLoginAuthInterceptor userLoginAuthInterceptor;

    /** * addInterceptors方法设置拦截路径 * addPathPatterns:需要拦截的访问路径 * excludePathPatterns:不需要拦截的路径, * String数组类型可以写多个用","分割 * @param registry */
    @Override
    public void addInterceptors(InterceptorRegistry registry){ 
   
        log.info(" ======== LoginConfig.addInterceptors");
        //添加对用户未登录的拦截器,并添加排除项
        //error路径,excludePathPatterns排除访问的路径在项目中不存在的时候,
        //springboot会将路径变成 /error, 导致无法进行排除。
        registry.addInterceptor(userLoginAuthInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/js/**", "/css/**", "/img/**", "/plugins/**")
                .excludePathPatterns("/login.html", "/register.html", "/system/user/login", "/system/user/login", "/index")
                .excludePathPatterns("/error");
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160971.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ant安装及环境配置「建议收藏」

    Ant安装及环境配置「建议收藏」1什么是AntApacheAnt是一个基于Java的生成工具。生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本2、下载、安装、环境变量配置ant下载地址https://download…

    2022年7月24日
    6
  • mysql数据库面试题目及答案_数据库面试题2021

    mysql数据库面试题目及答案_数据库面试题2021MySQL数据库面试题(2022版)文章目录一、基础基本概念MySQL有哪些数据库类型?CHAR和VARCHAR区别?数据库设计什么是三大范式?什么是范式和反范式,以及各自优缺点?二、索引索引的几种类型或分类?索引的优缺点?索引设计原则?索引的数据结构?Hash和B+树索引的区别?为何使用B+树而非B树做索引?什么是最左匹配原则?什么是覆盖索引?什么是索引下推?三、存储存储引擎有哪些常见的存储引擎?MyISAM和InnoDB的区别?InnoDB的四大特性?InnoDB为.

    2022年10月8日
    3
  • 李开复:人工智能时代怎样才不会被取代_李开复关于人工智能的演讲

    李开复:人工智能时代怎样才不会被取代_李开复关于人工智能的演讲提起“人工智能”你会想到什么?  是欧美大片里战无不胜、技能完备的人形机器人? 还是与柯洁等围棋名将上演惊世对决的AlphaGo?事实上人工智能并没有那么遥远 “比爱人还爱你”的手机…… 你每天晨起打开的电子新闻报…… 自动驾驶汽车或翻译软件…… 人工智能早已渗透在我们生活的每一个角落——它,无处不在。

    2022年9月29日
    4
  • Linux加密initramfs,initramfs 製作方式

    Linux加密initramfs,initramfs 製作方式Linuxkernel在自身初始化完成之后,需要能够找到并运行第一个用户程序(这个程序通常叫做“init”程序)。用户程序存在于文件系统之中,因此,内核必须找到并挂载一个文件系统才可以成功完成系统的引导过程。在grub中提供了一个选项“root=”用来指定第一个文件系统,但随着硬件的发展,很多情况下这个文件系统也许是存放在USB设备,SCSI设备等等多种多样的设备之上,如果需要正确引导,US…

    2022年8月11日
    9
  • 前端代码规范七大原则_织梦自定义表单源码

    前端代码规范七大原则_织梦自定义表单源码前言有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定频率认证源码分析defcheck_throttles(self,request):

    2022年7月29日
    8
  • 线上问题排查,一不小心踩到阿里的 arthas坑了

    线上问题排查,一不小心踩到阿里的 arthas坑了

    2020年11月19日
    232

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号