redis+token实现登录校验,前后端分离,及解跨域问题的4种方法

news2025/2/27 1:43:39

 

目录

一、使用自定义filter实现跨域

1、客户端向服务端发送请求

2、服务端做登录验证了,并生成登路用户对应的token,保存到redis

3、响应(报错)-----跨域问题

4、解决跨域问题--------服务器端添加过滤器,设置请求头

5、重新登录正确响应

6、客户端登redis录后访问页面,需要经过拦截器验证登录状态

7、编写拦截器

二、在任意配置类,返回一个 新的 CorsFIlter Bean 

三、使用注解 (局部跨域)

四、手动设置响应头(局部跨域)


前提:前后端分离

一、使用自定义filter实现跨域

1、客户端向服务端发送请求

使用ajax实现登录

<script>
        function login(){
            var userCode = $("#userCode").val();
            var userPassword = $("#userPassword").val();
            $.ajax({
                url:"http://localhost:9000/login.do",
                type:"post",
                data: "userCode="+userCode+"&userPassword="+userPassword,
                dataType: "text",
                success: function (result){
                    if(result!=null && result!=""){
                        alert("登录成功")
                        localStorage.token=result
                        window.location.href="view/frame.html";
                    }else {
                        alert("登录失败")
                    }
                }
            })
        }
    </script>

2、服务端做登录验证了,并生成登路用户对应的token,保存到redis

@RequestMapping ("/login.do")
    public String login(String userCode, String userPassword, Model model){
        User user = userService.login(userCode,userPassword);
        if(user!=null){
            //使用UUID生成token
            String token = UUID.randomUUID().toString().replace("-","");
            //把token保存到redis中,时效1小时
            RedisTools.setEx(token,user.getUserName(),1,TimeUnit.HOURS);
            System.out.println(token);
            return token;
        }
        return "";
    }

3、响应(报错)-----跨域问题

4、解决跨域问题--------服务器端添加过滤器,设置请求头

@Component
@WebFilter("/**")
public class MyCorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        //设置字符集编码
        HttpServletRequest request = (HttpServletRequest) req;
        request.setCharacterEncoding("UTF-8");
        HttpServletResponse response = (HttpServletResponse) res;
        response.setCharacterEncoding("UTF-8");
        //"*":允许任何请求源访问,实际生产环境按公司要求
        response.setHeader("Access-Control-Allow-Origin", "*");
        //设置请求方式
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        //最大时间
        response.setHeader("Access-Control-Max-Age", "3600");
        //response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        //添加自定义的请求头信息,"*"任何自定义请求头信息
        response.setHeader("Access-Control-Allow-Headers", "*");
        System.out.println("*********************************过滤器被使用**************************");
        //放行
        chain.doFilter(req, res);
    }
}

5、重新登录正确响应

6、客户端登redis录后访问页面,需要经过拦截器验证登录状态

客户端登录发送请求时,将token放入请求头中: headers:{"token":localStorage.token},

<script>
        function getUserList(){
            $.ajax({
                url: "http://localhost:9000/user/list.do",
                type:"get",
                headers:{"token":localStorage.token},
                dataType:"text",
                success:function (result){
                    alert(result)
                }
            })
        }
    </script>

7、编写拦截器

从请求头中获取token的值,判断是否不为空,且token这个key存在于rdeis中,若存在则放行,反之拦截

public class SysIntercerptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        if(StringUtil.isNullOrEmpty(token) || !RedisTools.hasKey(token)){
            System.out.println("登录已过期");
            PrintWriter out = response.getWriter();
            out.println("alert('登录已过期,请重新登录')");
            return false;
        }
        return true;
    }
}

前端

 后端

  

二、在任意配置类,返回一个 新的 CorsFIlter Bean 

@Configuration
public class CorsConfig  implements WebMvcConfigurer {
    //方式1
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 设置允许跨域的路由
        registry.addMapping("/**")
                //是否发送Cookie是否允许证书(cookies)
                .allowCredentials(true)
                // 设置允许跨域请求的域名------------修改此行//放行哪些原始域
                //.allowedOrigins("*")
                .allowedOriginPatterns("*")
                // 设置允许的方法
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");

    }
        //方式2
//    @Override
//    public void addCorsMappings(CorsRegistry registry){
//        registry.addMapping("/*/**")
//                .allowedHeaders("*")
//                .allowedMethods("*")
//                .maxAge(1800)
//                .allowedOrigins("*");
//    }
    
}

    When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead
当allowCredentials为true时,allowedOrigins不能包含特殊值“*”,因为不能在“Access Control Allow Origin”响应标头上设置该值。要允许一组来源的凭据,请显式列出它们或考虑改“allowedOriginPatterns”
 /*将红框中的.allowedOrigins("*")替换为.allowedOriginPatterns("*")即可*/

三、使用注解 (局部跨域)

@CrossOrigin(origins = "*")
 

四、手动设置响应头(局部跨域)

使用 HttpServletResponse 对象添加响应头(Access-Control-Allow-Origin)来授权原始域,这里 Origin的值也可以设置为 “*”,表示全部放行。

@RequestMapping("/index")
public String index(HttpServletResponse response) {
    response.addHeader("Access-Allow-Control-Origin","*");
    return "index";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis流式游标查询-大数据DB查询OOM查询问题

问题场景Mysql数据处理类型分以下三种com.mysql.cj.protocol.a.result.ResultsetRowsStatic&#xff1a;普通查询&#xff0c;将结果集一次性全部拉取到内存com.mysql.cj.protocol.a.result.ResultsetRowsCursor&#xff1a;游标查询&#xff0c;将结果集分批拉取到内存&#x…

Pytorch入门教程

Pytorch入门教程 Pytorch简介 概念&#xff1a;由Facebook人工智能研究小组开发的一种基于Lua编写的Torch库的Python实现的深度学习库。优势&#xff1a;简洁、上手快、具有良好的文档和社区支持、项目开源、支持代码调试、丰富的扩展库 Pytorch基础知识 1.张量Tensor 分类…

【Ubuntu新手入门2】深度学习环境配置 Anaconda+Pycharm+PyTorch

【Ubuntu新手入门2】深度学习环境配置 AnacondaPycharmpytorch前言安装PyTorch查看cuda版本mobaxterm软件远程连接linux服务器安装安装anaconda安装pycharm安装新环境pytorch前言 本系统&#xff1a;Ubuntu18.04&#xff0c;anaconda最新&#xff0c;Pycharm最新&#xff0c;P…

泛微采知连,为组织提供安全、合规、智能的数字化文控系统

作为市场主体&#xff0c;企业需要建立健全的质量管理体系&#xff0c;并且及时更新&#xff0c;以应对激烈的市场竞争&#xff0c;实现企业可持续发展。 质量体系在很大程度上通过文件化的形式表现出来。《质量管理体系要求》(GB/T19001—2016/ISO9001&#xff1a;2015)标准指…

ESP-IDF:TCP多线程并发服务器

核心代码&#xff1a; 核心思想就是主线程只处理socket监听功能&#xff0c;把数据处理部分分配到不同的线程中去处理。来了一个客户端连接&#xff0c;就分配新的线程去处理该客户端的数据请求。 代码&#xff1a; /多线程并发服务器/ #include <stdio.h> #include …

实用调试技巧【上篇】

&#x1f534;本文章是在 Visual Studio 2022&#xff08;VS2022&#xff09;编译环境下进行操作讲解 文章目录&#x1f973;1. 什么是bug&#xff1f;&#x1f973;2.调试有多重要&#xff1f;2.1. 我们是如何写代码的&#xff1f;2.2.调试是什么&#xff1f;2.3.调试的基本步…

uni-app 消息推送功能UniPush

uni-app 消息推送功能UniPush,这里用的是uni-app自带的UniPush1.0&#xff08;个推服务&#xff09;&#xff0c;所以只针对UniPush1.0介绍实现步骤。 建议查阅的文章&#xff1a; UniPush 1.0 使用指南[2] Unipush 常见问题[3] 当然现在已经出了UniPush2.0&#xff08;HBuilde…

如何编写一个 npm 插件?

提到写 npm 插件&#xff0c;很多没搞过的可能第一感觉觉得很难&#xff0c;无从下手&#xff0c;其实不然。 我们甚至写个简单的 console.log(hello word)&#xff0c;都是可以当成一个插件发布上去的。 其实无从下手的主要难点还是在于你的具体要做的功能逻辑&#xff0c;这…

FPGA纯verilog代码实现sobel 边缘检测,提供2套工程源码和技术支持

目录1、前言2、理论基础3、设计思路和架构4、图像输入5、RGB转灰度6、3x3卷积滑窗获取7、Sobel卷积运算8、FDMA图像缓存9、图像输出10、工程1详解&#xff1a;ov5640输入11、工程2详解&#xff1a;hdmi输入12、上板调试验证并演示13、福利&#xff1a;工程代码的获取1、前言 边…

vue 在线编辑、实时预览的代码交互组件 vue-code-view

文章目录前言实现安装依赖vue.config.js配置main.js 全局注册参数配置新建vue单文件组件库混合使用错误处理前言 vue-code-view是一个基于 vue 2.x、轻量级的代码交互组件&#xff0c;在网页中实时编辑运行代码、预览效果的代码交互组件。 官方手册&#xff1a; Vue Code Vie…

LeetCode 25. K 个一组翻转链表

原题链接 难度&#xff1a;hard\color{red}{hard}hard 题目描述 给你链表的头节点 headheadhead &#xff0c;每 kkk 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 kkk 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 kkk 的整数倍&#…

vue2配置cesium详细教程

1.简介 网络上现在关于vue配置cesium的教程有很多&#xff0c;包括csdn和掘金等。虽然这些教程在一定意义上提供了开发者如何配置cesium的方法&#xff0c;但是大部分的方法都不切实际&#xff0c;因为每个人的电脑中npm、node、cesium、vue、webpack的版本都基本不一致的&…

汽车直营模式下OTD全流程

概述 随着新能源汽车的蓬勃发展&#xff0c;造车新势力的涌入&#xff0c;许多新能源车企想通过直营的营销模式来解决新能源汽车市场推广速度缓慢问题&#xff0c;而直营模式下OTD&#xff08;Order-To-Delivery&#xff0c;订单-交付&#xff09;全流程的改革创新在这过程中无…

高压放大器在非线性超声传播研究中的应用

实验名称&#xff1a;高压放大器在非线性超声传播研究中的应用研究方向&#xff1a;超声波测试目的&#xff1a;超声波在混凝土中的传播是一个极为复杂的非线性过程。当超声波穿过混凝土材料时&#xff0c;携带了大量有关混凝土内部结构和构造的信息。传统的超声波检测方法虽然…

Android13通知运行时权限

部分应用更新到Android13以上之后&#xff0c;没有横幅(在屏幕上弹出)通知了。 Android 13&#xff08;API 级别 33&#xff09;及更高版本支持用于从应用发送非豁免&#xff08;包括前台服务 [FGS]&#xff09;通知的运行时权限&#xff1a;POST_NOTIFICATIONS。此更改有助于…

死锁(5.1)

死锁 1 死锁的基本概念 1.1 死锁的定义 死锁是发生在一组相互合作或竞争的线程或进程中的一个问题。因此可以定义为&#xff1a;一组竞争系统资源或相互通信的进程相互的“永久”阻塞。若无外力作用&#xff0c;这组进程将永远不能继续执行。 1.2死锁产生的原因进程 &…

第四章 统计机器学习

机器学习&#xff1a;从数据中学习知识&#xff1b; 原始数据中提取特征&#xff1b;学习映射函数f&#xff1b;通过映射函数f将原始数据映射到语义空间&#xff0c;即寻找数据和任务目标之间的关系&#xff1b; 机器学习&#xff1a; 监督学习&#xff1a;数据有标签&#x…

基于Java实现的商品出入库管理系统

基于Java实现的商品出入库管理系统&#xff08;文末附源码&#xff09; 前言 一、出入库管理系统含义介绍&#xff1a; 出入库管理系统是一套利用一物一码技术对仓库货物各环节实施全过程控制管理的系统&#xff0c;可对仓库货物进行入库、出库、货位、批次、保质期等实现一…

DDL 数据定义语言

DDL 数据定义语言 目录概述一、库的管理1、库的创建2、库的修改【一般不修改&#xff0c;容易出现错误】3、库的删除二、表的管理【重要】1、表的创建2、表的修改3、表的删除4、表的复制 【可以跨库复制】练习题概述 数据定义语言 库和表的管理 一、库的管理 创建、修改、删除…

分享116个HTML电子商务模板,总有一款适合您

分享116个HTML电子商务模板&#xff0c;总有一款适合您 116个HTML电子商务模板下载链接&#xff1a;https://pan.baidu.com/s/1gaff8RsoYUD_ep0ejhGkMw?pwdzby2 提取码&#xff1a;zby2 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 建筑行业电子商务模板 建…