Springboot实现filter拦截token验证和跨域

在springboot项目中使用Filter进行登录验证 首先发送login请求,过滤器会放行login请求,然后会返回给用户一个token,在用户发送其他请求时,需要在请求头里,携带token,然后过滤器会验证这个token是否有效,如果有效则可以正常发送请求,否则会返回请先登录提示信息。 阅读详情

背景

web验证授权合法的一般分为下面几种

  • 1使用session作为验证合法用户访问的验证方式
  • 使用自己实现的token
  • 使用OCA标准

在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其他东西,关键是简单实用。

合法登陆后一般使用用户UID+盐值+时间戳使用多层对称加密生成token并放入分布式缓存中设置固定的过期时间长(和session的方式有些相同),这样当用户访问时使用token可以解密获取它的UID并据此验证其是否是合法的用户。

#springboot中实现filter

  • 一种是注解filter
  • 一种是显示的硬编码注册filter

先有filter

 

import javax.servlet.annotation.WebFilter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import springfox.documentation.spring.web.json.Json;

import com.alibaba.fastjson.JSON;
 
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



/***************
 * token验证拦截
 * @author bamboo zjcjava@163.com
 * @time 2017-08-01
 */
@Component
//@WebFilter(urlPatterns = { "/api/v/*" }, filterName = "tokenAuthorFilter")
public class TokenAuthorFilter implements Filter {

	private static Logger logger = LoggerFactory
			.getLogger(TokenAuthorFilter.class);

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse rep = (HttpServletResponse) response;

		//设置允许跨域的配置
		// 这里填写你允许进行跨域的主机ip(正式上线时可以动态配置具体允许的域名和IP)
		rep.setHeader("Access-Control-Allow-Origin", "*");
		// 允许的访问方法
		rep.setHeader("Access-Control-Allow-Methods","POST, GET, PUT, OPTIONS, DELETE, PATCH");
		// Access-Control-Max-Age 用于 CORS 相关配置的缓存
		rep.setHeader("Access-Control-Max-Age", "3600");
		rep.setHeader("Access-Control-Allow-Headers","token,Origin, X-Requested-With, Content-Type, Accept");


		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		String token = req.getHeader("token");//header方式
		ResultInfo resultInfo = new ResultInfo();
		boolean isFilter = false;
		
			
		String method = ((HttpServletRequest) request).getMethod();
		if (method.equals("OPTIONS")) {
			rep.setStatus(HttpServletResponse.SC_OK);
		}else{
			
			
			if (null == token || token.isEmpty()) {
				resultInfo.setCode(Constant.UN_AUTHORIZED);
				resultInfo.setMsg("用户授权认证没有通过!客户端请求参数中无token信息");
			} else {
				if (TokenUtil.volidateToken(token)) {
					resultInfo.setCode(Constant.SUCCESS);
					resultInfo.setMsg("用户授权认证通过!");
					isFilter = true;
				} else {
					resultInfo.setCode(Constant.UN_AUTHORIZED);
					resultInfo.setMsg("用户授权认证没有通过!客户端请求参数token信息无效");
				}
			}
			if (resultInfo.getCode() == Constant.UN_AUTHORIZED) {// 验证失败
				PrintWriter writer = null;
				OutputStreamWriter osw = null;
				try {
					osw = new OutputStreamWriter(response.getOutputStream(),
							"UTF-8");
					writer = new PrintWriter(osw, true);
					String jsonStr = JSON.toJSONString(resultInfo);
					writer.write(jsonStr);
					writer.flush();
					writer.close();
					osw.close();
				} catch (UnsupportedEncodingException e) {
					logger.error("过滤器返回信息失败:" + e.getMessage(), e);
				} catch (IOException e) {
					logger.error("过滤器返回信息失败:" + e.getMessage(), e);
				} finally {
					if (null != writer) {
						writer.close();
					}
					if (null != osw) {
						osw.close();
					}
				}
				return;
			}
			
			if (isFilter) {
			logger.info("token filter过滤ok!");
			chain.doFilter(request, response);
			}
		}
			
		
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {

	}

}

注解配置filter

加上如下配置则启动时会根据注解加载此filter
@WebFilter(urlPatterns = { “/api/*” }, filterName = “tokenAuthorFilter”)

硬编码注册filter

在application.java中加入如下代码


    //注册filter
    @Bean  
    public FilterRegistrationBean  filterRegistrationBean() {  
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();  
        TokenAuthorFilter tokenAuthorFilter = new TokenAuthorFilter();  
        registrationBean.setFilter(tokenAuthorFilter);  
        List<String> urlPatterns = new ArrayList<String>();  
        urlPatterns.add("/api/*");
        registrationBean.setUrlPatterns(urlPatterns);  
        return registrationBean;  
    }  

以上两种方式都可以实现filter

跨域说明

springboot可以设置全局跨域,但是对于filter中的拦截地址并不其中作用,因此需要在dofilter中再次设置一次

区局设置跨域方式如下
##方式1.在application.java中加入如下代码

	//跨域设置
	private CorsConfiguration buildConfig() {  
        CorsConfiguration corsConfiguration = new CorsConfiguration();  
        corsConfiguration.addAllowedOrigin("*");  
        corsConfiguration.addAllowedHeader("*");  
        corsConfiguration.addAllowedMethod("*");  
        
        
        
        return corsConfiguration;  
    }  
      
    /** 
     * 跨域过滤器 
     * @return 
     */  
    @Bean  
    public CorsFilter corsFilter() {  
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();  
        source.registerCorsConfiguration("/**", buildConfig()); // 4  
        return new CorsFilter(source);  
    }  

方式2.配置注解

必须集成WebMvcConfigurerAdapter类


/**********
 * 跨域 CORS:使用 方法3
 * 方法:
	1服务端设置Respone Header头中Access-Control-Allow-Origin
	2配合前台使用jsonp
	3继承WebMvcConfigurerAdapter 添加配置类
	http://blog.youkuaiyun.com/hanghangde/article/details/53946366
 * @author xialeme
 *
 */
@Configuration  
public class CorsConfig extends WebMvcConfigurerAdapter{  
  
   /* @Override  
    public void addCorsMappings(CorsRegistry registry) {  
        registry.addMapping("/**")  
                .allowedOrigins("*")  
                .allowCredentials(true)  
                .allowedMethods("GET", "POST", "DELETE", "PUT")  
                .maxAge(3600);  
    }  */
  
	private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1
        corsConfiguration.addAllowedHeader("*"); // 2
        corsConfiguration.addAllowedMethod("*"); // 3
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig()); // 4
        return new CorsFilter(source);
    }
  
    
} 

在这里插入图片描述

spring boot-使用Filter实现Header认证 前言 假设客户端在http请求中,已经加入了Header的认证信息,例如: HttpPost post = new HttpPost("http://localhost:8990/sendMail"); StringEntity entity = new StringEntity(json, "utf-8"); entity.setContentType("applicatio 阅读详情

相关推荐

Spring Boot 如何集成JWT实现Token验证

它定义了一种紧凑的,自包含的方式,用于通信双方之间以JSON对象的形式安全传递信息。JWT使用HMAC算法或者是RSA的公私秘钥的数字签名技术,所以这些信息是可被验证和信任的。近年来,随着前后端分离、微服务等架构的兴起,传统的cookie+session身份验证模式已经逐渐被基于Token的身份验证模式取代。然后,调用http://localhost:8080/testToken 验证token是否有效。JWT(Java版)的github地址:https://github.com/jwtk/jjwt。

weixin_44837153的博客 1420

SpringBoot(九)jwt + 拦截器实现token验证

前面两篇文章的过滤器和拦截器,我们都提到过可以做诸如权限验证的事情。http/https是无状态的协议,当用户访问一个后端接口时,如何判断该用户有没有权限?当然,可以使用账号+密码去验证。但是,如果使用账号和密码,需要频繁访问数据库,很明显,会带来一些额外的开销。本篇介绍下使用jwt和拦截器实现token权限验证。

zhaojun的博客 1万+

SpringBoot拦截器实现登录鉴权与权限控制实战

拦截器是SpringMVC中处理HTTP请求的重要组件,通过预处理和后处理机制实现横切关注点。其核心原理是在控制器方法执行前后插入自定义逻辑,常用于身份认证、日志记录等场景。相比Filter,拦截器能直接访问Spring容器资源,支持更精细的路径匹配控制。在安全领域,基于拦截器的登录鉴权方案能有效统一权限校验逻辑,结合Token验证和RBAC模型,可大幅提升系统安全性。典型实现包含Token解析、用户状态检查、权限校验等步骤,通过ThreadLocal传递用户上下文,并需注意防止内存泄漏。该技术方案适用于需

weixin_30702441的博客 297

SpringBoot项目使用JWT+拦截器实现token验证

上述流程当中token的具体实现方式为JWT,其全称是,官网地址:https://jwt.io/就是通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。

weixin_44320429的博客 1万+

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题):1.登录时的验证码2.自动登录的实现3.怎么维护前后端登录状态在这和大家分享下我实现此功能的过程,包括一些技术和心得1.登录时的验证码为什么要验证码,原因很简单,防止脚本无限次重复登录,来暴力破解用户密码或者攻击服务器验证码的出现,使得每次登录都有个动态变量需要输入,无...

yyyy11119的博客 4270

《Sigrity SystemSI 2023+LPDDR4仿真自学笔记》(一)创建工程(Part1)

为了加强SystemSI 2023软件的熟悉度,咱们完整的走一个仿真全流程。

weixin_45199544的博客 6323

java token过滤器_Springboot实现filter拦截token验证和跨域

importjavax.servlet.annotation.WebFilter;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Component;importspringfox.documentation.spring.web.json.Json;importco...

weixin_36018119的博客 1810

Android Camera性能优化概述

做camera性能优化方面的工作有几年了,想写一篇文章简单介绍一下其中涉及到的具体技术,这篇文章会大概介绍一下涉及到的技术。

weixin_42136255的博客 4023

SpringBoot集成JWT实现Token登录验证

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它通常用于身份验证和信息交换,因为其紧凑且自包含的特性,使得它可以在不同的环境中轻松传递和验证。

等什么君!的博客 3333

全志V3S开发板实战:从零构建嵌入式Linux系统

本文提供了一份针对全志V3S开发板(如LicheePi Zero)的零基础教程,详细指导如何从零开始构建嵌入式Linux系统。内容涵盖编译环境搭建、交叉工具链配置、U-Boot引导程序编译与烧录、Linux内核定制与编译,以及使用Buildroot构建根文件系统,最终实现系统成功启动,帮助开发者深入理解嵌入式系统构建全流程。

tensor9flow的博客 574

MATLAB基础应用精讲-【数模应用】游程检验(附MATLAB、R语言和python代码实现)

游程检验是一种非参数性统计假设的检验方法,它是游程总数检验和最大游程检验的总称,用于两个独立样本的比较和观测结果随机性的检验测试。​游程检验亦称“连贯检验”,是根据样本标志表现排列所形成的游程的多少进行判断的检验方法。[2]例1:设某样本n=12人的标志表现为男、女,有以下三种排列。(i) 男\男,女\女\女,男,女\女,男\男\男\男;(ii) 男\男\男\男\男\男\男,女\女\女\女\女;(iii) 男,女,男,女,男,女,男,女,男,女,男\男;连续出现男或女的区段称为游程。

qq_36130719的博客 605

在 springboot 3.X 中快速上手 Filter(过滤器),实现Token的拦截

Filter 是前端请求到达 Servlet 之前使用的工具,适用于处理与业务无关的通用逻辑,如:Token 校验、权限控制、重定向等以上就是对 Filt er 的简单使用,我们可以用它在登录时验证 token 的有效性;用密码登录时,将 token 放到 header 中,以及验证用户是否有权限访问一些页面和功能。

qq_60391603的博客 1920

Arduino读取串口接收到的数据并发送数据

Arduino读取串口接收到的数据并发送数据 源程序: void setup() { Serial.begin(115200); } void loop() { String comdata ; while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); } if (comdata.length() > 0) { Serial.print("串口接收到的数据:"); Serial.println(comd

perseverance51博客 1万+

手把手教你用springboot打造标准系统(三)--Token登陆和跨域处理

现在开发流行使用VUE做前端,通过前后端分离的方式来架构系统。那么为什么要前后端分离呢? 首先,前后端分离是团队合作的产物,团队任务分工后,前端工程师专注前端业务展现,后端工程师专注业务逻辑。 其次,前后端分离有利于系统大流量的并发处理。分离后,前端通常会采取CDN加速,以达到快速展现的目标,同时减轻了网络带宽和服务器的压力。 由于本人在VUE上的造诣一般,这里就不多讲VUE,只是用来做一些显示...

ox23t的专栏 1228

YOLO11改进|YOLO11中引入注意力和卷积融合模块CAFMAttention

YOLO11改进|YOLO11中引入注意力和卷积融合模块CAFMAttention

A1983Z的博客 1218

k8s 不同node之间pod ip不通

底层k8s使用calico网络,ipip网络模式,kubevirt启动了2台虚拟机;在这两台虚拟机上再搭建k8s,calico网络,ipip网络模式。说明:我是使用helm安装的calico,改这个模式要改crd资源ippools。其他方式安装的calico修改方法可能不一样。在虚拟机上的k8s上启动了2个pod,分布在不同的node上,这两个pod不能ping通对方的pod ip。修改虚拟机之上的k8s集群的calico网络的ipipMode为Never即可,之前使用的是Always。

weixin_40548182的博客 4054

Springboot token令牌验证解决方案 在SpringBoot实现基于Token的用户身份验证

1.首先了解一下Token 1、token也称作令牌,由uid+time+sign[+固定参数]组成: uid: 用户唯一身份标识 time: 当前时间的时间戳 sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查数据库 2.tok...

Marc1999的博客 1257

【定制功能】LVGL 页面管理

页面管理的主要针对实际复杂的UI项目的。支持多页面管理,包含页面跳转和返回(主要是方便项目功能管理)支持后台页面自动销毁、前台页面自动创建(主要是节约资源使用)支持语言切换逻辑(页面重建功能)支持主题切换逻辑支持页面切换动画效果首先,页面管理是针对act_src图层来讲的。仅在screens数组中供act_src切换的对象树才会被此页面管理功能所管理。这意味着,如果top_layer或者sys_layer图层上,有页面需要重建时,需要特殊处理(实际项目中top_layer或者。

Bigan(安)的博客 5751

亲测有效!SpringBoot项目采用JWT登录认证与保持,并解决跨域问题

在使用JWT实现认证时,需要将生成的token存储到前端,并在每次向后端发送请求时将token放入请求header中,这样后端才能识别该用户是否已登录以及是否有权限访问该接口。这段代码会在每次请求前检查localstorage中是否存在token,并将其添加到请求的header中。注意:为了避免XSS攻击,不要直接将token存储在localstorage中,可以考虑使用sessionStorage或者cookie等更加安全的存储方式。一步步跟着做就可以了。

weixin_45928161的博客 2052

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

超详细! springboot整合Filter_拦截器_注解+aop的方式实现token校验

超详细! springboot整合Filter_拦截器_注解+aop的方式实现token校验

Think_and_work的博客 2174

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringBoot实现拦截器和过滤器

一、使用Interceptor拦截器 1.首先新建一个拦截器实现HandlerInterceptor接口 以一个简单的token验证为例,验证通过,将用户信息放入作用域,返回true 不通过返回false @Service public class UserTokenInterceptor implements HandlerInterceptor { @Autowired priv...

徐光耀的博客 8848

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

在springboot项目中的登录请求拦截,使用Filter(过滤器)如何实现?即Filter(过滤器的实现步骤)

在springboot项目中的登录请求拦截,使用Filter(过滤器)如何实现?即Filter(过滤器的实现步骤)

hzk1791318012的博客 933
上一篇: redis在spring和springboot中的使用方式以及遇到的坑
下一篇: nginx配置vue-router+webpack项目部署访问刷新出现404问题
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值