Springboot实现filter拦截token验证和跨域
转载:https://blog.csdn.net/zjcjava/article/details/78237164
背景
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);@Overridepublic void destroy() {}@Overridepublic 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);}}}@Overridepublic 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-Origin2配合前台使用jsonp3继承WebMvcConfigurerAdapter 添加配置类http://blog.csdn.net/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("*"); // 1corsConfiguration.addAllowedHeader("*"); // 2corsConfiguration.addAllowedMethod("*"); // 3return corsConfiguration;}@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", buildConfig()); // 4return new CorsFilter(source);}}
---------------------
作者:牧竹子
来源:CSDN
原文:https://blog.csdn.net/zjcjava/article/details/78237164
Springboot实现filter拦截token验证和跨域相关推荐
- SpringBoot中配置拦截器时,跨域失效
SpringBoot中配置拦截器时,跨域失效 前后段分离的项目,配置了跨域后,访问正常,但是配置了拦截器以后,有的访问正常,有的出现跨域问题,发现出现跨域问题的都是拦截器里面没有放行的请求. @Con ...
- SpringBoot集成JWT实现token验证
Jwt全称是:json web token,以JSON对象的形式安全的传递信息.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过 ...
- SpringBoot+JWT实现登陆token验证并存储用户信息
基于Token的JWT认证 JWT:Json web token 是为了在网络应用环境间传递声明而执行的一种基于JSON传输格式的开放标准,可实现无状态.分布式的Web应用授权. 缺点:用户主动注销, ...
- Spring Boot——Spring Security环境下跨域addCorsMappings与拦截器冲突导致跨域失效解决方案
问题分析 [SpringMVC]与权限拦截器冲突导致的Cors跨域设置失效问题 解决方案 @Beanpublic CorsFilter corsFilter() {//1.添加CORS配置信息Cors ...
- SpringBoot 整合 JWT 实现 Token 验证
前言 在Spring Security整合oauth2实现认证token也不满足实际生产需求的时候,可以整合Jwt实现token认证,完全手写获取token,认证token的方法. Maven依赖包 ...
- SpringBoot+Shiro放行OPTIONS请求,解决跨域问题
问题: 集成shiro之后发现配置放行的接口可以正常访问,而需要登录验证的接口会报错 其中OPTIONS类型的接口会报302 导致后续的post请求报错提示跨域问题 Shiro登录流程 首先Shiro ...
- 全局配置axios、axios 拦截器 和 proxy 跨域代理
目录 一.全局配置axios 1. 为什么要全局配置 axios 2. 如何全局配置 axios 3. 在 vue3 的项目中全局配置axios 4. 在 vue2 的项目中全局配置 axios ...
- vue3.0-axios拦截器、proxy跨域代理
目录 1. vue-cli 1)vue-cli 2)安装vue-cli ①解决Windows PowerShell不识别vue命令的问题 3)创建项目 4)基于vue ui创建vue项目 5)基于命令 ...
- Ajax提交打开新窗口,浏览器拦截处理;以及跨域问题
//主要是添加同步处理 $.ajax({url: "ashx/OrderHander.ashx?action=CheckRepeat",data: { "OrderId& ...
- 开源UReport 整合到产品中实践简要:(五)vue中用iframe显示展现报表数据解决token问题及跨域问题
一.vue页面组件中定义以下内容: <iframe ref="iReportFrame" id="uReportFrame" src="&quo ...
最新文章
- boost::mp11::mp_fill相关用法的测试程序
- Netty(二)——TCP粘包/拆包
- pythonfor久久_python 九九乘法表 for循环
- 魅族16s Pro邀请函发布:对称式全面屏+骁龙855Plus
- 【kafka】kafka 启动 KafkaController 相关源码分析
- android launcher推荐,追求效率的你,需要这款 Android 最快启动器:FastKey Launcher
- php生成wsdl文件,利用nusoap生成wsdl文件
- BackTrack4安装中文语言包
- Java初级程序员面试中应该如何准备?一般公司对Java开发的要求有哪些?
- python实现oa系统_利用Python实现某OA系统的自动定位功能
- PS怎么调整字体的行间距
- 从 virtio 网卡收包段错误问题出发反思个人问题分析的过程
- signature=e7411d00c74ac359f20083a015dc6ea9,MS12-020:遠端桌面的弱點可能會允許遠端程式碼執行:2012 年 3 月 13 日...
- 阿塞拜疆对加密货币收入及利润征税
- Windows 内存机制说明
- DTAS 国产三维尺寸公差分析软件尺寸链计算几何数据导入应用
- 西电微机系统课程设计步进电机开环控制系统
- 如何通俗地理解协方差和相关系数?
- 尼尔机械纪元安卓机器人_尼尔机械纪元安卓正版下载-尼尔机械纪元steam下载-k73游戏之家...
- Java 读取Word表格中的文本和图片
热门文章
- enum java 判断相等_聊一聊Java的枚举enum
- ns.ajax,UIWebView使用NSURLProtocol(拦截),ajax加载失败的问题
- 230.二叉搜索树中第K小的元素
- python Tk()、Frame()、TopLevel()用法
- 您不是订单管理的定向开发者_全面升级投放和营销能力 华为应用市场商业推广助力开发者高效增长...
- 如何理解Beta分布和Dirichlet分布?
- 最新android APP框架介绍
- 计算机图形学完整笔记(二):光栅图形学算法
- 企业安全:业务的安全韧性
- Hibernate getById方法 could not initialize proxy - no session