权限控制之异常处理方式三|学习笔记

简介: 快速学习权限控制之异常处理方式三

开发者学堂课程【Spring Security知识精讲与实战演示(二):权限控制之异常处理方式三】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/731/detail/13055


权限控制之异常处理方式三

 

内容介绍

一、 处理异常步骤

二、 代码

 

一、处理异常步骤

编写这个专门它的原理还是拦截器,首先要写个拦截器,其次在spring配置文件中,属于配置拦截器,可以在MVC中用Internet去配置,但如果只是做异常处理,就不需要重新去写一个拦截器,因为spring已经准备好了一个专门的接口,其底层原理也是拦截器,首先右键来创建一个新的对象,

image.png

这里边有一个叫advice,然后在这里边也可以写上Handler controller exception,需要将当前对象放入到IOC容器中,可以在这个对象上加controller注解,也可以直接加component注解, 这个component注解就是一个通用的IOC注解,它也能将对象放入到容器中,但是当不确定对象是哪一层的时候,用这个注解。现在的情况可以用它。接下来在这后边需要实现一个接口,叫HanderExceptionResolver。实现完这个接口之后,要知道它需要重写什么方法,看一下参数,首先request response,这是select的一个API,后面这两个东西,@param o这个是出现异常的对象,就哪个对象出一层就是一个objase,但这个一般情况用的也不多,接下来是@param e出现的异常信息。这个是需要用的,返回值是model And View。看着复杂实际简单,因为真正要处理异常,并不是要把这个异常给解决掉,只是想让它跳转到自己定义的一个相对来说比较友好的一个界面而已,所以哪一个对象出现异常了,可以直接去判断这个异常的信息,根据异常的信息来做一个跳转,首先有一个返回值Model And View,写上一个MV等于new一个Model and view。这里边也可以将MV return给他按掉,它其实可以这么来写,MV.add Object然后给他一个K值,比如说叫error Msg,然后写e.getmessage,这样就把异常信息给放进来了,这个是将异常信息放入request域中,但是这个基本不用,因为给它提示,每一个页面错误很明显,没必要再给一个英文的提示,然后还有一个是必须要写的,就是指定不同异常跳转的页面,比如 If可以先来e instanceof,属于AccessDeniedException异常,那就MV.setViewName,可以直接去写,但是这是经过视图解析器的,不要直接去写个403是错的,直接写403打开视图解析器,它会在前面拼一个前缀pages,后面拼个后缀jsp,所以不能让他经过视图解析器,可以加关键字forward:/403.jsp 加了这个就能直接过来,但是地址栏是不会变的,如果想让地址栏变,可以加上一个redirect,加forward是请求转发,加redirect是重定向,这两个都可以,不同的是加redirect,最后地址栏可能会变成403.jsp,如果加forward地址栏依旧是请求,比如请求的是这个地址栏,这边出现403,如果加了redirect,那地址栏就变成了403.jsp,当然可以加eles,直接向其他所有的异常导向500。这里面都是500,可以再细致分一下。再次重启,启动完成之后,直接访问。继续用xiaoma登陆。现在出现500,这里边是is denied,那这个异常是跳到500了,而不是跳到403,还将异常信息给了,自己写的request域,它会把这个异常推给你,但是这个异常应该不属于刚才那个异常,这个异常直接拦住了,连打印都没有打印,这个异常类是包到货,所以不出403,应该是倒包,虽然控制了但是他跳的不是想要的页面,再测一次,刷新完了之后再一次来访问,这里边继续用xiaoma登录,这个应该是会给跳到403的, product回车,这个方式成功了,但是这种方式写起来有点麻烦,spring提供了另外一种非常简单的方式,可以ctrlA 把这个全注掉,就意味这个类在这里边不存在了,接下来可以直接复制粘贴,那在这里边可以改个名字,叫Advice,然后所有的给他放开。之后将这个类名改一下,比如叫Handler Controller Advice,改过来之后注意,implements HanderEceptionResolver不需要写了,只需要在上面加上一个叫controller Advice注解,加了这个注解他就类似于已经实现这个接口,并且放到IOC容器中,类似于一个处理器,可以随便写,比如处理器可以写string返回路径,到这也可以写handerException主要是在上面需要加一个注解,这个注解叫ExceptionHander。他在注解的内部告诉这里是异常,只要是属于最大的Throwable异常都可以,以刚才AccessDeniedException为例,就要写多几个,下面包也不要导错。如果是这个异常接下来就到可以到403。如果不是这个地方,就可以再来一个。比如runttimeHanderException,统一来了500。这里面可以写很多个,功能跟上面差不多,也可以直接在runtime内部做判断,再来测试一下接下来就继续首页访问,用xiaoma点登陆。接下来继续点订单,他是可以访问的,接下来product回车, 得到下图

image.png

404这个地方不是没跳转成这个页面,就犯了一个错误,而是加了一个前后缀,经过视图解析器需要加一个前缀。比如redirect:/403,成功后可以看到他去的是403,是想要的结果,只不过忘记加关键字了,加forward加redirect都可以,接下来就继续访问,继续用xiaoma登录,403是没问题的,这里面是从定性到403,其实是访问这个productfindall重定向到403了。

 

 

二、代码

public class HandlerControllerException implements HandlerExceptionResolver{

/**

*Cparam httpServletRequest*Cparam httpServletResponse*Cparam o 出现异常的对象*Cparam e出现的异常信息

*@return Mode lAndView

*/

@Override

public ModelAndViewresolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, Ob ject

ModelAndViewmv=new ModelAndView()://将异常信息放入request域中,基本不用

mv.add0bject(attributeName:"errorMsg",e.getMessage());//指定不同异常跳转的页面 if(){

return mv;}

相关文章
|
数据挖掘 Shell 测试技术
怎么用Python解析HTML轻松搞定网页数据
**Python解析HTML摘要** 本文介绍了使用Python处理HTML的常见需求,如数据提取、网络爬虫和分析,并讨论了三种解析方法。正则表达式适用于简单匹配,但对复杂HTML不理想;BeautifulSoup提供简单API,适合多数情况;lxml结合XPath,适合处理大型复杂文档。示例展示了如何用这些方法提取链接。
596 2
|
10月前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
482 13
|
存储 API 图形学
Unity精华☀️二、到底是什么原因导致“万向锁”?旋转翻车的终极解析!
Unity精华☀️二、到底是什么原因导致“万向锁”?旋转翻车的终极解析!
|
11月前
多线程通信和同步的方式有哪些?
【10月更文挑战第6天】
740 61
|
XML 前端开发 JavaScript
JavaScript进阶 - AJAX请求与Fetch API
【7月更文挑战第9天】JavaScript进阶:AJAX与Fetch API对比。AJAX用于异步数据交换,XMLHttpRequest API复杂,依赖回调。Fetch API是现代、基于Promise的解决方案,简化请求处理。示例:`fetch('url').then(r => r.json()).then(data => console.log(data)).catch(err => console.error(err))`。注意点包括检查HTTP状态、错误处理、CORS、Cookie和超时。Fetch提高了异步代码的可读性,但需留意潜在问题。
303 0
|
算法 调度
【完全复现】基于改进粒子群算法的微电网多目标优化调度
该文档描述了一个使用改进粒子群算法实现的微电网多目标优化调度的Matlab程序。该模型旨在最小化运行成本和环境保护成本,将多目标问题通过权值转换为单目标问题解决。程序中定义了决策变量,如柴油发电机、微型燃气轮机、联络线和储能的输出,并使用全局变量处理电负荷、风力和光伏功率等数据。算法参数包括最大迭代次数和种群大小。代码调用了`PSOFUN`函数来执行优化计算,并展示了优化结果的图表。
|
存储 关系型数据库 MySQL
mysql中的left join、right join 、inner join的详细用法
【8月更文挑战第16天】在MySQL中,`INNER JOIN`、`LEFT JOIN`与`RIGHT JOIN`用于连接多表。`INNER JOIN`仅返回两表中匹配的行;`LEFT JOIN`保证左表所有行出现于结果中,右表无匹配时以NULL填充;`RIGHT JOIN`则相反,保证右表所有行出现于结果中。例如,查询学生及其成绩时,`INNER JOIN`仅显示有成绩的学生;`LEFT JOIN`显示所有学生及他们对应的成绩,无成绩者成绩列为空;`RIGHT JOIN`显示所有成绩及对应学生信息,无学生信息的成绩条目则为空。
712 1
|
安全 测试技术 数据库
RC 漏洞挖掘:开发厂商.(批量通杀)(教育漏洞报告平台)
RC 漏洞挖掘:开发厂商.(批量通杀)(教育漏洞报告平台)
381 2
|
Java 关系型数据库 MySQL
Spring Boot中集成MySQL数据库的步骤和技巧
Spring Boot中集成MySQL数据库的步骤和技巧
|
SQL 数据可视化 数据处理
实时计算 Flink版产品使用问题之如何进行数据加密之后怎么解密
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用问题之如何进行数据加密之后怎么解密