登录
注册
关于我们
简体中文
ENGLISH
搜索
购物车
0 ITEMS ON YOUR CART
首页
动态
方案
案例
专栏
期刊
联系我们
首页
期刊
Spring Boot Ext JS准前后端框架应用的会话(Session)处理
Ext JS开发大全
第1章 Ext JS快速入门示例[4/4]
第12章[12.10]富文本编辑器 CKEditor与Ext JS的整合
第12章[12.10.1] Ext JS + CKEditor+Spring Boot 实现编辑器图片上传
第11章[11.6] Ext JS 自行搭建远端库的包升级版本后找不到的问题解决
[Ext JS 4] 实战之Grid, Tree Gird编辑
ext命令集
第12章[12.3] Ext JSGrid中的超链接列及其功能实现
[Ext JS]textfield添加compositionstart、compositionupdate 和compositionend _os
[Ext JS ] 动添切换字段的必填与非必填
3.1 Ext JS 组件总览
[Ext JS] Grid表格批量编辑的实现
Ext JS 快速开发工具
带触发器按钮的输入框
Ext JS的布尔对象类型处理及便捷方法
Ext JS的Object类型处理及便捷方法
ExtJS RadioGroup(单选按钮组) 使用及注意事项
Ext JS 模拟后端数据实现
ToolTip 实现全介绍
Ext JS下拉单选框(Combobox,TagFied)使用及疑难问题解决
Ext JS应用测试概览
Sencha Studio 监视工具( Inspect Tool)
Ext JS 4 升级指南
Ext JS 如何定义公用方法(单例类 or 静态方法)
Ext JS的模块化开发(Package)
Ext3 -- Form 实例。 用来migrate file 数据到DB用的
ExtJS 3 在Tab下加入Form 实例
Extjs Grid 中给已经添加过Filter的列增加标识
Extjs 实战之 Ext.tree.TreePanel Tree无法显示
Extjs弹出框的异步执行
Grid 动态该表列( reconfigure)的性能改善
Spring Boot Ext JS准前后端框架应用的会话(Session)处理
[Ext JS 4] Extjs 图表 Legend(图例)的分行与分列显示
[Ext JS 4] Extjs 之 initComponent 和 constructor的区别
[Ext JS 4] Grid 中的单元格添加Tooltip 的效果
[Ext JS 4] Grid 实战之分页功能
[Ext JS 4] Grid 组件
[Ext JS 4] MVC 应用程序框架
[Ext JS 4] MVC 应用程序框架
发布 [Ext JS 4] contentEL,renderTo, applyTo 释义与区别
[Ext JS 4] 动态加载
[Ext JS 4] 实战之 ComboBox 和 DateField (消失之解决办法)
[Ext JS 4] 实战之 Picker 和 Picker Field
[Ext JS 4] 实战之 带week(星期)的日期选择控件(二)
[Ext JS 4] 实战之 ComboBox 和 DateField 的点击事件在IE下失效
## [Ext JS 4] 实战之 带week(星期)的日期选择控件(三)
[Ext JS 4] 实战之 带week(星期)的日期选择控件
[Ext JS 4] 实战之Chart 坐标控制(单坐标,双坐标)
[Ext JS 4] 实战之Chart, Column Chart 定制颜色
[Ext JS 4] 实战之Grid, Tree Gird 动态添加列
[Ext JS 4] 实战之Grid, Tree Gird 动态添加列续(性能考虑)
[Ext JS 4] 实战之Grid, Tree Gird 动态添加行
[Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
[Ext JS 4] 实战之Grid, Tree Gird编辑Cell
[Ext JS 4] 实战之Load Mask - 在Grid Reconfigure的使用状况
[Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
[Ext JS 4] 实战之多选下拉单 (带checkbox) 续 - 带ALL 选项
[Ext JS 4] 实战之多选下拉单 (带checkbox)
[Ext JS 4] 实战之升级系列一[Ext jS 3-->Ext JS 4]
[Ext JS 4] 实战之将chart导出为png, jpg 格式的文件
[Ext JS 4] 实战之浏览器兼容
[Ext JS 4] 布局之实战二 - 中间区块不会自动伸展 (tab)续
[Ext JS 4] 组件之图表
[Ext JS 4]后台自动产生图档
[Ext JS 4]性能优化
[Ext JS 7 ]7.5 自适应配置 - Responsive Configs
[Ext JS 7] 关联(Association)
[Ext JS 7]事件(Event)
[Ext JS 7]ClassRequire错误解决
[Ext JS 7]的开发模式
[Ext JS 7]基于NPM的开发
[Ext JS ] 动添切换字段的必填与非必填
[Ext JS4] 数据包
[Ext JS4系列]Ext JS4 入门
[Ext JS6] Grid不同列的关联编辑
[Ext JS6] ViewControllers-视图控制器
[Ext JS6]Ext.Template
[Ext JS6]Sencha Cmd
[Ext JS6]编码规范
[Ext JS6]多类型设备开发
[Ext JS6]工作区-Workspace
[Ext JS6]路由(Routing)及使用
[Ext JS6]视图模型和数据绑定
[Ext JS6实战] Ajax获取Tree Store
[Ext JS6实战] Ext.XTemplate
[Ext JS6实战]动态数据绑定
[Ext JS] Sencha Cmd命令参考之二
[Ext JS] Sencha Cmd命令参考之一
[Ext JS] Group Grid-分组网格
[Ext JS] Group Grid-分组网格
[Ext JS]嵌套Grid的实现及注意事项
[Ext JS]SimXhr.js__dc=1659315492151_65 Uncaught TypeError问题分析与解决
[Ext JS]Sencha Studio安装与快速介绍之一
[Ext JS]textfield 添加 compositionstart、compositionupdate 和 compositionend
[Ext JS]图片显示方式
[ExtJS 6]Grid分页工具栏无效问题解决
[ExtJS6]ResponsiveColumn-自适应列布局
[Extjs 4] 类系统
基于Ext JS的模块化应用框架搭建及开发
[Ext JS] 自行搭建远端库的包升级版本后找不到的问题解决-The following versions are available
[Ext JS]鼠标移入移除时弹出和关闭窗口
[Ext JS]富文本编辑器 CKEditor与Ext JS的整合
[Ext JS]可编辑列Grid的全场景开发
['Ext JS]Grid中的超链接列及其功能实现
[Ext JS]Ext JS + CKEditor+Spring Boot 实现编辑器图片上传
[Ext JS]介绍与快速入门1
[Ext JS]实现带动态数字的图标
Spring Boot+Ext JS 实现图形验证码
Ext JS介绍与快速入门2
Ext JS开发基本环境准备与项目创建
[Ext JS]开发模式及快速测试方式
[Ext JS]多类型终端-电脑、移动端(手机、平板)
[Ext JS]基于Ext JS的MVC/MVVM架构的应用开发模式
[Ext JS]Ext JS的类与类体系
[Ext JS]Ext JS组件、容器与布局
[Ext JS]组件与容器的选择与开发
[Ext JS]Ext JS数据模型与数据封装
[Ext JS]Ext JS的控制器类型及使用
[Ext JS]说透Ext JS的窗口及对话框用法
[Ext JS]说透Ext JS的窗口及对话框用法
[Ext js]Grid行选择的多种场景和实现方式
[Ext JS]Ext JS类的继承与混合
CmsWing
Spring Boot Ext JS准前后端框架应用的会话(Session)处理
## Spring Boot+Ext JS准前后端框架应用的会话(Session)处理 ### 准前后端分离的Session机制 Spring Boot + Ext JS的准前后端分离架构,Cmd 使用JSP作为模板文件进行Build, 通过JSP 的Session对象进行前后端连接的控制。 JSP 的Session机制大致是,在浏览器访问服务端的时候,服务端对针对此客户端创建一个Session对象,此Session对象中可以存储前端验证通过的用户相关信息,服务器将Session的ID发送个浏览器,浏览器保存该ID,在每次访问服务端的时候都会带上此ID。有几种状况,该Session会失效: 服务端原因:超过后端设置的Session超时时间设置,浏览器端再使用该Session ID就会认为是无效。 Session的超时设置可以在应用服务器或是应用的配置文件中进行设置。 客户端原因: 在浏览器端清除了该Session ID,再此访问时从服务端获取的就是一个新的Session 对象的ID,这个Session对象没有用户相关信息,除非重新登录。 ### Session失效的场景 需要和服务端交互才能知道是否超时,如果仅仅是前端视图的切换,不调用后端服务,则无法感知Session已经失效。所以在典型的Ext JS应用中,会出现Session失效的场景有: 网格的数据的更新:Grid中的Store的更新,Store的load()方法被调用。 按钮的点击操作。一般而言,点击某个按钮,会通过Ajax调用后端的服务。 View Model模式的数据更新 ### Session失效的解决 Session失效的典型处理就是弹出用户名/密码输入框,调用后端异步登录方法登录。 后端处理 但后端Session失效时,后端无法通过前端的Session ID从对应的Session对象中获取用户信息, 后端统一抛出Session超时的返回即可,比如以下返回。 ```javascript { success:false, code:401, msg:'Session Time out'} ``` HTTP的401 代表是用户对某资源没有访问权限,可以借用这个返回码定义应用的Session和认证相关的错误,也可以新增加一码,比如: 4010 代表没有登录 4011 用户名密码错误 4012 Session超时 ### 前端处理 针对Grid的更新和Ajax的请求时Session的失效状况: Grid中数据的更新,其实是对应Store的重新加载,在定义该Store时,可以通过该Store的Proxy进行设置,添加Proxy的exception的事件的处理,在该事件对应的函数中,如果返回的是Session Timeout的返回, 则弹出用户名/密码输入框进行输入。 Ajax呼叫则通过返回的响应判读是否是Session Timeout的返回,如是则弹出用户名/密码输入框进行输入。 ViewModel的处理和Ajax类似, 同样是判断返回。 ### 是否回调 重新输入用户名/密码之后,有的操作需要登录后自动调用之前未成功执行的,需要自动执行,比如Grid的更新;有的操作则提示用户重新点击执行,比如点击按钮的操作。 因为Store和Ajax都是异步呼叫,所以某一时刻可能有多个操作触发了重新登录,而登录框只能是最早触发的那个弹出,后面的不需要弹出多个用户/密码输入框。比如:Session超时时同时触发了三个动作,则第一个侦测的动作弹出对话框,后面两个不需要弹出, 但是,但是,这个两个操作可能需要回调。所以,需要回调的部分需要放入一个队列中,当成功登录后,这个队列中需要回调的方法依次执行。 ### 主要代码示例片段 Store的处理 getProxyCfg:function(url,store,method,contentType,paramsAsJson){ var proxyCfg = { type : 'ajax', url : url, actionMethods:{ read : method!=null?method:'GET' }, reader: { type: 'json', rootProperty: 'datas' },listeners:{ exception:function( thisProxy, response, operation, eOpts ){ var obj = Ext.decode(response.responseText); if(obj.code!=null&&obj.code.length>3&&obj.code.substr(0,3)=="401"){ if(store.lastOptions!=null&&store.lastOptions.callback!=null&&typeof(store.lastOptions.callback)=='function') { var callbackFunc = store.lastOptions.callback; Ext.getApplication().getController("main").login(obj.msg,function(){store.load(callbackFunc)}); }else{ Ext.getApplication().getController("main").login(obj.msg,function(){store.load()}); } } } } }; Ajax呼叫共用方法 ```javascript callServiceWithSesChkAndResp:function(url, method, paramObj, callbackFunc, isJsonParam,moreParamObj,iCount){ var me = this; if(iCount==null) iCount = 1; var requestCfg = { url : url, method : method, // params : paramObj, success : function(response, opts) { if(me.isSessionInvalidResponse(response)){ var obj = Ext.decode(response.responseText); Ext.getApplication().getController("main").login(obj.msg,function(){ me.callServiceWithSesChkAndResp(url, method, paramObj, callbackFunc, isJsonParam,moreParamObj,iCount++); }); }else{ if (obj != null && obj.success != null && obj.success == false) { Ext.Msg.alert('Fail', obj.msg); }else{ if (callbackFunc != null && typeof (callbackFunc) === "function") { callbackFunc(response); } } } }, failure : function(response, opts) { console.log('server-side failure with status code ' + response.status); } }; if (paramObj != null) { if (isJsonParam != null && isJsonParam === true) { requestCfg.jsonData = paramObj; } else { requestCfg.params = paramObj; } } Ext.Ajax.request(requestCfg); } ```
网站导航
首页
动态
方案
案例
专栏
期刊
联系我们