RuoYi(若依开源框架)-前后台分离版-后端流程简单分析
【项目结构】
├── common // 工具类
│ └── annotation // 自定义注解
│ └── config // 全局配置
│ └── constant // 通用常量
│ └── core // 核心控制
│ └── enums // 通用枚举
│ └── exception // 通用异常
│ └── filter // 过滤器处理
│ └── utils // 通用类处理
├── framework // 框架核心
│ └── aspectj // 注解实现
│ └── config // 系统配置
│ └── datasource // 数据权限
│ └── interceptor // 拦截器
│ └── manager // 异步处理
│ └── security // 权限控制
│ └── web // 前端控制
├── ruoyi-generator // 代码生成(可移除)
├── ruoyi-quartz // 定时任务(可移除)
├── ruoyi-system // 系统代码
├── ruoyi-admin // 后台服务
├── ruoyi-xxxxxx // 其他模块
-登录请求过程
前端发起请求:http://127.0.0.1:8080/login
防止重复提交拦截器捕获
【------------ruoyi-framework\src\main\java\com\ruoyi\framework\interceptor\RepeatSubmitInterceptor.java------------------】
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
if (handler instanceof HandlerMethod)
{
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);
if (annotation != null)
{
if (this.isRepeatSubmit(request))
{
AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试");
ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult));
return false;
}
}
return true;
}
else
{
return super.preHandle(request, response, handler);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
【1】请求先进入过滤器,符合要求放行,不符合放行一个空请求
【-------------------ruoyi-common\src\main\java\com\ruoyi\common\filter\RepeatableFilter.java-----------------------】
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
ServletRequest requestWrapper = null;
if (request instanceof HttpServletRequest
&& StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE))
{
requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
}
if (null == requestWrapper)
{
chain.doFilter(request, response);
}
else
{
chain.doFilter(requestWrapper, response);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
【2】安全机制捕获
【-------------------ruoyi-framework\src\main\java\com\ruoyi\framework\config\SecurityConfig.java-----------------------】
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
httpSecurity
// CSRF禁用,因为不使用session
.csrf().disable()
// 认证失败处理类
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// 基于token,所以不需要session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// 过滤请求
.authorizeRequests()
// 对于登录login 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/captchaImage").anonymous()
.antMatchers(
HttpMethod.GET,
"/",
"/*.html",
"/**/*.html",
"/**/*.css",
"/**/*.js",
"/profile/**"
).permitAll()
.antMatchers("/common/download**").anonymous()
.antMatchers("/common/download/resource**").anonymous()
.antMatchers("/swagger-ui.html").anonymous()
.antMatchers("/swagger-resources/**").anonymous()
.antMatchers("/webjars/**").anonymous()
.antMatchers("/*/api-docs").anonymous()
.antMatchers("/druid/**").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();
httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
// 添加JWT filter
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 添加CORS filter
httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
【3】SysLoginController的post方法login获取到请求,并调用login()方法进行登录验证
【-------------------ruoyi-admin\src\main\java\com\ruoyi\web\controller\system\SysLoginController.java-----------------------】
@Autowired
private SysLoginService loginService;
/**
* 登录方法
*
* @param loginBody 登录信息
* @return 结果
*/
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
System.out.println("This is login!");
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
return ajax;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@PostMapping是一个组合注解,是@RequestMapping(method=RequestMethod.POST)的缩写。
@GetMapping、@PutMapping、@PatchMapping和@DeleteMapping,与@PostMapping实现类似
1
2
【4】SysLoginServicer对请求发来的信息进行验证,以此调用mapper映射接口完成持久层操作
【5】完成后向前端返回AjaxResult ajax信息
springboot security 安全机制
认证流程:
1、由认证配置WebSecurityConfigurerAdapter的configure(HttpSecurity http)方法进入,添加拦截器addFilterBefore
2、进入拦截器AbstractAuthenticationProcessingFilter的attemptAuthentication方法,指定认证对象AbstractAuthenticationToken
3、进入认证逻辑AuthenticationProvider,根据supports的断定对认证的目标对象指定对哪个拦截器进行认证,进入具体的认证逻辑方法authenticate
4、认证结果:认证成功后进入拦截器的successfulAuthentication方法;认证失败后进入拦截器的unsuccessfulAuthentication方法
5、对认证结果进行处理
a.认证成功的逻辑:进入SimpleUrlAuthenticationSuccessHandler的onAuthenticationSuccess方法
b.认证失败的逻辑:进入SimpleUrlAuthenticationFailureHandler的onAuthenticationFailure方法
6、返回结果给页面,将数据封装在ObjectMapper对象中,将会以文本形式返回给客户端(页面)
RuoYi(若依开源框架)-前后台分离版-后端流程简单分析相关推荐
- (前端版)RuoYi(若依开源框架)研究第一天
前端版RouYi(开源框架)研究第一天 项目结构 ├── build // 构建相关 ├── bin // 执行脚本 ├── public // 公共文件 │ ├── favicon.ico // f ...
- 从零入门开源框架---若依(前后端分离版)
一.若依是什么? 若依它就是一个开源项目,别人写好的代码,我们拿来进行二次开发,它主要是做数据和权限管理系统. 二.使用背景 任何公司的各种大的项目必然需要一个后台权限管理系统,这是必然的,但是如果不 ...
- php的ci框架前后台分离,基于CodeIgniter框架的前后端完全分离开发
想用CI框架做个网站,有以下几个需求: 1.前后端完全分离,前台和后台都使用JSON格式接口进行数据交换: 2.不管是前台还是后台,其前端和后端都是独立的一个项目. 不知道这个怎么实现,希望各位大牛指 ...
- 内网映射到公网实例(APP:花生壳 项目:若依前后端分离版-后端)
内网映射教程(APP:花生壳 项目:ruoyi-vue后端) 一.[下载花生壳客户端](https://hsk.oray.com/download) 二.扫码注册登录 三.登录APP,新增内网映射 四 ...
- 开源安卓播放器:Dolphin Player 简单分析
Dolphin播放器(Dolphin Player)是一款开源的音频和视频播放器,它支持大多数的音频和视频文件模式,也支持大部分的字幕文件格式.它是基于ffmpeg的. 项目主页:http://cod ...
- 百度飞桨全新升级:重磅推出PaddleHelix平台、开源框架V2.0RC,硬件生态路线图全公开...
12月20日,WAVE SUMMIT+2020深度学习开发者峰会在北京举办.本届峰会,百度飞桨带来八大全新发布与升级,有支持前沿技术探索和应用的生物计算平台PaddleHelix螺旋桨,开发更加便捷的 ...
- python框架大全_常用的Python开源框架有哪些?列举这3个
随着人工智能快速发展,不仅在各个领域应用日益广泛,同时也引发了教学内容的变革和创新.人工智能的火热得益于成功的开源以及深度学习框架的不断涌现.而Python作为一种脚本语言,具有易学.易维护等优点,它 ...
- 什么是工作流开源框架?可提高办公效率吗?
如果要提高办公效率,那么采用什么样的软件可以实现?低代码开发平台是近些年得到不少企业喜爱的一种提高效率的软件平台,拥有表单设计.工作流引擎.微服务架构.代码开发套件等多个功能,这种企业级应用低代码开发 ...
- 词达人自动做题PHP版全套开源+前后台分离开发+带半个软件+CDKey兑换
简介: 开发语言:PHP+Mysql 源码简介与安装说明: 易语言版的我是今天写的.多线程有需要再去调风控,恶心的一批.我这网课上到现在基本上啥TM也没学.就这样了.我就简单上几张图自己看看吧.前端是 ...
最新文章
- 清华校庆正当时,智能小车决赛日
- int数组,找小于右边所有数,大于左边所有数的数
- mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)
- 机器学习算法小结与收割offer遇到的问题
- 搜索引擎学习(一)初识Lucene
- 实现DEDE转跳属性文档在模板上调用出转跳地址
- 软件项目与产品的区别与联系_软件产品和软件过程之间的区别和关系
- 主板bios修改、刷新
- CNN卷积神经网络原理详解(上)
- Laravel文档梳理5、HTTP请求
- java实现mysql拦截_在mybatis执行SQL语句之前进行拦击处理实例
- win10中修改mac地址(总有一款适合你)
- 用python的tkinter做游戏(八)—— 实现图片在tkinter中自适应大小(自动匹配窗口)
- 小程序踩坑之地图定位不精准的问题
- AS如何设置ProgressBar宽度以及实现反向进度条
- 网页重复度检测——shingling算法
- Android 字体库的使用
- LimeSDR 自定义软件无线电 (SDR)平台 USB3.0
- ASP.NET动态网站开发培训-04.创建一个四则运算器
- 幻想三国ol服务器没有响应,《幻想三国OL》新手攻略新手必知的三点建议
热门文章
- html网页语言是什么,HTML是什么?
- openssh 7.4 java使用_openssh/openssl升级到7.4和1.0.2j 源码方式
- pve虚拟机导入gho_用vmware安装gho文件心得
- python列表实现原理_Python动态类型实现原理及过程解析
- 用计算机探索,学生计算机基础的应用探索
- fastdfs php client,centos 5.7_64位下FastDFS_client的配置和PHP测试
- 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub
- java 闹钟代码_JAVA可视化闹钟源码
- C++ vector用法 基本用法
- 采用 opencv surf 算子进行特征匹配