JwtFilter---解决其中的跨域问题

JwtFilter

第五步:定义jwt的过滤器JwtFilter。

这个过滤器是我们的重点,这里我们继承的是Shiro内置的AuthenticatingFilter,一个可以内置了可以自动登录方法的的过滤器,有些同学继承BasicHttpAuthenticationFilter也是可以的。

我们需要重写几个方法:

  1. createToken:实现登录,我们需要生成我们自定义支持的JwtToken

  2. onAccessDenied:拦截校验,当头部没有Authorization时候,我们直接通过,不需要自动登录;当带有的时候,首先我们校验jwt的有效性,没问题我们就直接执行executeLogin方法实现自动登录

  3. onLoginFailure:登录异常时候进入的方法,我们直接把异常信息封装然后抛出

  4. preHandle:拦截器的前置拦截,因为我们是前后端分析项目,项目中除了需要跨域全局配置之外,我们再拦截器中也需要提供跨域支持。这样,拦截器才不会在进入Controller之前就被限制了。

跨域

下面我们看看总体的代码:

  • com.markerhub.shiro.JwtFilter
@Component
public class JwtFilter extends AuthenticatingFilter {@AutowiredJwtUtils jwtUtils;@Overrideprotected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {// 获取 tokenHttpServletRequest request = (HttpServletRequest) servletRequest;String jwt = request.getHeader("Authorization");if(StringUtils.isEmpty(jwt)){return null;}return new JwtToken(jwt);}@Overrideprotected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {HttpServletRequest request = (HttpServletRequest) servletRequest;String token = request.getHeader("Authorization");if(StringUtils.isEmpty(token)) {return true;} else {// 判断是否已过期Claims claim = jwtUtils.getClaimByToken(token);if(claim == null || jwtUtils.isTokenExpired(claim.getExpiration())) {throw new ExpiredCredentialsException("token已失效,请重新登录!");}}// 执行自动登录return executeLogin(servletRequest, servletResponse);}@Overrideprotected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {HttpServletResponse httpResponse = (HttpServletResponse) response;try {//处理登录失败的异常Throwable throwable = e.getCause() == null ? e : e.getCause();Result r = Result.fail(throwable.getMessage());String json = JSONUtil.toJsonStr(r);httpResponse.getWriter().print(json);} catch (IOException e1) {}return false;}/*** 对跨域提供支持*/@Overrideprotected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {HttpServletRequest httpServletRequest = WebUtils.toHttp(request);HttpServletResponse httpServletResponse = WebUtils.toHttp(response);httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));// 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {httpServletResponse.setStatus(org.springframework.http.HttpStatus.OK.value());return false;}return super.preHandle(request, response);}
}

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

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

相关文章

win10关闭“Windows安全中心”功能的两种方法

win10系统怎么将windows安全中心关闭? 听语音 原创|浏览:10407|更新:2020-03-24 10:541 2 3 4 5 6 7 分步阅读 一些软件需要将Windows安全中心关闭。 方法/步骤 1 首先打开开始菜单。 2 在开始菜单中点击设置按钮。 3 在设置界…

ASP.NET Core 中间件Diagnostics使用

ASP.NET Core 中间件(Middleware)Diagnostics使用。对于中间件的介绍可以查看之前的文章ASP.NET Core 开发-中间件(Middleware)。 Diagnostics中间件,主要功能是用于报告和处理ASP.NET Core中的异常和错误信息,以及诊断Entity Framework核心迁移错误。 其…

使用java底层实现邮件的发送(含测试,源码)

直接上代码:3个类,两个主要的类,一个测试类: 主类(Mail): /** * Title: Mail.java * Package org.service.impl * Description: TODO该方法的主要作用: * author A18ccms A18ccms_…

Java多线程:线程状态

转载自 Java多线程:线程状态 一. 线程状态类型 1. 新建状态(New):新创建了一个线程对象。 2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行…

配置计算机系统doc,[计算机系统配置实用程序.doc

[计算机系统配置实用程序初学者在使用电脑过程中,肯定会碰到各种各样的问题:如怎么管理电脑的自启动程序、如何查看加载的系统服务、怎样从安装光盘提取丢失的系统文件等。为了解决类似问题,微软在系统中提供了一个实用工具——系统配置实用程…

Win10怎么关闭开机启动项

Win10怎么关闭开机启动项 我们可以首先打开电脑的运行对话框,按下键盘的WINR组合键,打开运行。 然后这里我们在运行对话框中输入命令msconfig确定,打开系统配置程序。 系统配置窗口,启动里面点击这里的任务管理器打开。 这时…

TypeScript 2.1发布

TypeScript是微软开发的一个JavaScript的超集,提供了最新的JavaScript特性以及可选的静态类型。近日,TypeScript 2.1发布。该版本提供了功能更为强大的类型检查器,并且让开发人员可以编写出更简洁的代码。以下是该版本带来的主要新特性&#…

使用spring实现邮件的发送(含测试,源码,注释)

此篇主要讲的是使用spring配置实现邮件发送,与之前的底层实现简便了不少,只需要几个配置就可以了,那么请往下看: 先写个接口 /** * Title: IMailserdService.java * Package org.service * Description: TODO该方法的主要作用&a…

海南计算机网络技术学校,三亚广播电视大学计算机网络技术专业_海南报名_网络教育计算机网络技术专业教学计划_中国教育在线...

一、培养目标及规格专科,两年制三年业余学习,最短学习年限不低于两年半。本专业培养热爱社会主义祖国,拥护党的基本路线,具有良好的思想品德和职业道德以及健康的劳动态度;具有创新精神和实践能力,掌握必要…

Java并发编程:线程池的使用

转载自 Java并发编程:线程池的使用 一.Java中的ThreadPoolExecutor类 java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的…

你当前无权访问该文件夹 解决你当前无权访问该文件夹拒绝你访问该文件夹

我 这样就完成了 http://www.xitonghe.com/jiaocheng/windows7-5642.html https://jingyan.baidu.com/article/4b52d702aa01b3fc5c774b1b.html Win10正式版提示你当前无权访问该文件夹怎么办 https://jingyan.baidu.com/article/4b52d702aa01b3fc5c774b1b.html 1407345人看了…

SpringBoot+Vue博客系统---后端接口开发

Java后端接口开发 从零开始搭建一个项目骨架,最好选择合适,熟悉的技术,并且在未来易拓展,适合微服务化体系等。所以一般以Springboot作为我们的框架基础,这是离不开的了。 然后数据层,我们常用的是Mybati…

图说世界编程语言排行

TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如Google、MSN、Yahoo!、Wikipedia、YouTube以及Baidu等)进行计算…

java三大框架实现任务调度——IRemindService

java实现任务调度,主要分为几个步骤: 1.创建一个服务 2.创建一个任务类,将服务作为一个任务去完成(实现job接口) 3.创建一个任务类实体 4.创建一个触发器,指定触发规则…

中国有超级计算机的大学,计算机专业排名看超算实力,ASC竞赛五大高校排名,中山大学第一...

ASC竞赛五大高校计算机专业的实力主要体现在算法与编程的逻辑运算上,因此计算机专业必须掌握大量基础数学知识,甚至很多是离散数学、模糊数学等人工智能逻辑数学,简单的程序软件应用和O2O程序实现其实都不是计算机专业实力的体现,…

IntelliJ IDEA设置JDK版本

IntelliJ IDEA设置JDK版本 临渊行 2019-06-13 13:59:13 46888 收藏 30 分类专栏: 这里有个坑 版权 一、背景 即使我电脑安装的JDK版本是8,然而在idea运行中常常提示xxjdk1.5已过时之类的,why?明明是我装的JDK8啊 二、解决 鼠标点击f…

从抵触到力推,.Net Core的成功让微软正视开源

微软在两年前做了一件当时非常令人惊讶的事情:将 .Net Core 开源。在此之前,微软曾表示开源是对软件经济的威胁。或许是为了更好的销售工具和云服务,亦或许是为了吸引更多的开发者到其平台,微软开始开源。到目前为止,这…

vue的基本项目结构

vue的基本项目结构 ├── README.md 项目介绍 ├── index.html 入口页面 ├── build 构建脚本目录 │ ├── build-server.js 运行本地构建服务器,可以访问构建后的页面 │ ├── build.js 生产环境…

线程池的原理及实现

转载自 线程池的原理及实现 1、线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线…

计算机考试行高怎么设置,Excel隔行调整行高的四种有效方法

领导要求把一份Excel表格的偶数行行高调整一下。这份表格可是有上百行的,逐一调整行高显然是不科学的。几经周折,费了我N多的口舌四处讨教,这个任务还是顺利地完成了。一、直接定位法先在表格的最后增加一个辅助列。在该列的第一行的单元格中…