转载: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验证和跨域相关推荐

  1. SpringBoot中配置拦截器时,跨域失效

    SpringBoot中配置拦截器时,跨域失效 前后段分离的项目,配置了跨域后,访问正常,但是配置了拦截器以后,有的访问正常,有的出现跨域问题,发现出现跨域问题的都是拦截器里面没有放行的请求. @Con ...

  2. SpringBoot集成JWT实现token验证

    Jwt全称是:json web token,以JSON对象的形式安全的传递信息.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过 ...

  3. SpringBoot+JWT实现登陆token验证并存储用户信息

    基于Token的JWT认证 JWT:Json web token 是为了在网络应用环境间传递声明而执行的一种基于JSON传输格式的开放标准,可实现无状态.分布式的Web应用授权. 缺点:用户主动注销, ...

  4. Spring Boot——Spring Security环境下跨域addCorsMappings与拦截器冲突导致跨域失效解决方案

    问题分析 [SpringMVC]与权限拦截器冲突导致的Cors跨域设置失效问题 解决方案 @Beanpublic CorsFilter corsFilter() {//1.添加CORS配置信息Cors ...

  5. SpringBoot 整合 JWT 实现 Token 验证

    前言 在Spring Security整合oauth2实现认证token也不满足实际生产需求的时候,可以整合Jwt实现token认证,完全手写获取token,认证token的方法. Maven依赖包 ...

  6. SpringBoot+Shiro放行OPTIONS请求,解决跨域问题

    问题: 集成shiro之后发现配置放行的接口可以正常访问,而需要登录验证的接口会报错 其中OPTIONS类型的接口会报302 导致后续的post请求报错提示跨域问题 Shiro登录流程 首先Shiro ...

  7. 全局配置axios、axios 拦截器 和 proxy 跨域代理

    目录 一.全局配置axios 1. 为什么要全局配置 axios 2. 如何全局配置 axios 3. 在 vue3 的项目中全局配置axios ​ 4. 在 vue2 的项目中全局配置 axios ...

  8. vue3.0-axios拦截器、proxy跨域代理

    目录 1. vue-cli 1)vue-cli 2)安装vue-cli ①解决Windows PowerShell不识别vue命令的问题 3)创建项目 4)基于vue ui创建vue项目 5)基于命令 ...

  9. Ajax提交打开新窗口,浏览器拦截处理;以及跨域问题

    //主要是添加同步处理 $.ajax({url: "ashx/OrderHander.ashx?action=CheckRepeat",data: { "OrderId& ...

  10. 开源UReport 整合到产品中实践简要:(五)vue中用iframe显示展现报表数据解决token问题及跨域问题

    一.vue页面组件中定义以下内容: <iframe ref="iReportFrame" id="uReportFrame" src="&quo ...

最新文章

  1. boost::mp11::mp_fill相关用法的测试程序
  2. Netty(二)——TCP粘包/拆包
  3. pythonfor久久_python 九九乘法表 for循环
  4. 魅族16s Pro邀请函发布:对称式全面屏+骁龙855Plus
  5. 【kafka】kafka 启动 KafkaController 相关源码分析
  6. android launcher推荐,追求效率的你,需要这款 Android 最快启动器:FastKey Launcher
  7. php生成wsdl文件,利用nusoap生成wsdl文件
  8. BackTrack4安装中文语言包
  9. Java初级程序员面试中应该如何准备?一般公司对Java开发的要求有哪些?
  10. python实现oa系统_利用Python实现某OA系统的自动定位功能
  11. PS怎么调整字体的行间距
  12. 从 virtio 网卡收包段错误问题出发反思个人问题分析的过程
  13. signature=e7411d00c74ac359f20083a015dc6ea9,MS12-020:遠端桌面的弱點可能會允許遠端程式碼執行:2012 年 3 月 13 日...
  14. 阿塞拜疆对加密货币收入及利润征税
  15. Windows 内存机制说明
  16. DTAS 国产三维尺寸公差分析软件尺寸链计算几何数据导入应用
  17. 西电微机系统课程设计步进电机开环控制系统
  18. 如何通俗地理解协方差和相关系数?
  19. 尼尔机械纪元安卓机器人_尼尔机械纪元安卓正版下载-尼尔机械纪元steam下载-k73游戏之家...
  20. Java 读取Word表格中的文本和图片

热门文章

  1. enum java 判断相等_聊一聊Java的枚举enum
  2. ns.ajax,UIWebView使用NSURLProtocol(拦截),ajax加载失败的问题
  3. 230.二叉搜索树中第K小的元素
  4. python Tk()、Frame()、TopLevel()用法
  5. 您不是订单管理的定向开发者_全面升级投放和营销能力 华为应用市场商业推广助力开发者高效增长...
  6. 如何理解Beta分布和Dirichlet分布?
  7. 最新android APP框架介绍
  8. 计算机图形学完整笔记(二):光栅图形学算法
  9. 企业安全:业务的安全韧性
  10. Hibernate getById方法 could not initialize proxy - no session