接口的安全设计要素有哪些?

概述

与前端对接的API接口,如果被第三方抓包并进行恶意篡改参数,可能会导致数据泄露,甚至会被篡改数据,我主要围绕时间戳,token,签名三个部分来保证API接口的安全性

968e187655d70e807a6aaca1266153df.jpeg

1.用户成功登陆站点后,服务器会返回一个token,用户的任何操作都必须带了这个参数,可以将这个参数直接放到header里。

2.客户端用需要发送的参数和token生成一个签名sign,作为参数一起发送给服务端,服务端在用同样的方法生成sign进行检查是否被篡改。

3.但这依然存在问题,可能会被进行恶意无限制访问,这时我们需要引入一个时间戳参数,如果超时即是无效的。

4.服务端需要对token,签名,时间戳进行验证,只有token有效,时间戳未超时,签名有效才能被放行。

开放接口

没有进行任何限制,简单粗暴的访问方式,这样的接口方式一般在开放的应用平台,查天气,查快递,只要你输入正确对应的参数调用,即可获取到自己需要的信息,我们可以任意修改参数值。

/*
 * Description: 开放的接口
 * @author huangweicheng
 * @date 2020/12/21
*/
@RestController
@RequestMapping( "/token")
public  class TokenSignController {

     @Autowired
     private TokenSignService tokenSignService;

     @RequestMapping(value =  "openDemo",method = RequestMethod.GET)
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;List<PersonEntity>&nbsp;openDemo(int&nbsp;personId){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;tokenSignService.getPersonList(personId);
&nbsp;&nbsp;&nbsp;&nbsp;}
}

Token认证获取

用户登录成功后,会获取一个ticket值,接下去任何接口的访问都需要这个参数。我们把它放置在redis内,有效期为10分钟,在ticket即将超时,无感知续命。延长使用时间,如果用户在一段时间内没进行任何操作,就需要重新登录系统。扩展:

@RequestMapping(value&nbsp;=&nbsp; "login",method&nbsp;=&nbsp;RequestMethod.POST)
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;JSONObject&nbsp;login(@NotNull&nbsp;String&nbsp;username,&nbsp;@NotNull&nbsp;String&nbsp;password){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;tokenSignService.login(username,password);
&nbsp;&nbsp;&nbsp;&nbsp;}

登录操作,查看是否有这个用户,用户名和密码匹配即可成功登录。

/**&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Description:验证登录,ticket成功后放置缓存中,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;huangweicheng
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@date&nbsp;2020/12/31&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;JSONObject&nbsp;login(String&nbsp;username,String&nbsp;password){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;result&nbsp;=&nbsp; new&nbsp;JSONObject();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PersonEntity&nbsp;personEntity&nbsp;=&nbsp;personDao.findByLoginName(username);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(personEntity&nbsp;==&nbsp; null&nbsp;||&nbsp;(personEntity&nbsp;!=&nbsp; null&nbsp;&&&nbsp;!personEntity.getPassword().equals(password))){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "success", false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "ticket", "");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "code", "999");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "message", "用户名和密码不匹配");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;result;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(personEntity.getLoginName().equals(username)&nbsp;&&&nbsp;personEntity.getPassword().equals(password)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ticket&nbsp;=&nbsp;UUID.randomUUID().toString();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ticket&nbsp;=&nbsp;ticket.replace( "-", "");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.opsForValue().set(ticket,personEntity.getLoginName(), 10L,&nbsp;TimeUnit.MINUTES);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "success", true);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "ticket",ticket);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "code", 200);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "message", "登录成功");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;result;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "success", false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "ticket", "");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "code", "1000");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.put( "message", "未知异常,请重试");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;result;
&nbsp;&nbsp;&nbsp;&nbsp;}

Sign签名

把所有的参数拼接一起,在加入系统秘钥,进行MD5计算生成一个sign签名,防止参数被人恶意篡改,后台按同样的方法生成秘钥,进行签名对比。

/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;request
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;static&nbsp;Boolean&nbsp;checkSign(HttpServletRequest&nbsp;request,String&nbsp;sign){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean&nbsp;flag=&nbsp; false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查sigin是否过期
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enumeration<?>&nbsp;pNames&nbsp;=&nbsp;&nbsp;request.getParameterNames();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map<String,&nbsp;String>&nbsp;params&nbsp;=&nbsp; new&nbsp;HashMap<String,&nbsp;String>();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while&nbsp;(pNames.hasMoreElements())&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;pName&nbsp;=&nbsp;(String)&nbsp;pNames.nextElement();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( "sign".equals(pName))&nbsp; continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;pValue&nbsp;=&nbsp;(String)request.getParameter(pName);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params.put(pName,&nbsp;pValue);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( "现在的sign-->>"&nbsp;+&nbsp;sign);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println( "验证的sign-->>"&nbsp;+&nbsp;getSign(params,secretKeyOfWxh));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sign.equals(getSign(params,&nbsp;secretKeyOfWxh))){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;=&nbsp; true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;flag;
&nbsp;&nbsp;&nbsp;&nbsp;}

重复访问

引入一个时间戳参数,保证接口仅在一分钟内有效,需要和客户端时间保持一致。

public&nbsp;static&nbsp;long&nbsp;getTimestamp(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long&nbsp;timestampLong&nbsp;=&nbsp;System.currentTimeMillis();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long&nbsp;timestampsStr&nbsp;=&nbsp;timestampLong&nbsp;/&nbsp; 1000;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;timestampsStr;
&nbsp;&nbsp;&nbsp;&nbsp;}

需要跟当前服务器时间进行对比,如果超过一分钟,就拒绝本次请求,节省服务器查询数据的消耗

拦截器

每次请求都带有这三个参数,我们都需要进行验证,只有在三个参数都满足我们的要求,才允许数据返回或被操作。

public&nbsp; class&nbsp;LoginInterceptor&nbsp;implements&nbsp;HandlerInterceptor&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp; @Autowired
&nbsp;&nbsp;&nbsp;&nbsp; private&nbsp;RedisTemplate&nbsp;redisTemplate;

&nbsp;&nbsp;&nbsp;&nbsp; @Override
&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;boolean&nbsp;preHandle(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response,Object&nbsp;handler)&nbsp;throws&nbsp;IOException&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;jsonObject&nbsp;=&nbsp; new&nbsp;JSONObject();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ticket&nbsp;=&nbsp;request.getParameter( "ticket");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sign&nbsp;=&nbsp;request.getParameter( "sign");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ts&nbsp;=&nbsp;request.getParameter( "ts");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(StringUtils.isEmpty(ticket)&nbsp;||&nbsp;StringUtils.isEmpty(sign)&nbsp;||&nbsp;StringUtils.isEmpty(ts)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "success", false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "message", "args&nbsp;is&nbsp;isEmpty");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "code", "1001");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;printWriter&nbsp;=&nbsp;response.getWriter();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printWriter.write(jsonObject.toJSONString());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果redis存在ticket就认为是合法的请求
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(redisTemplate.hasKey(ticket)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(redisTemplate.opsForValue().getOperations().getExpire(ticket));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;values&nbsp;=&nbsp;(String)&nbsp;redisTemplate.opsForValue().get(ticket);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断ticket是否即将过期,进行续命操作
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(redisTemplate.opsForValue().getOperations().getExpire(ticket)&nbsp;!=&nbsp;- 2&nbsp;&&&nbsp;redisTemplate.opsForValue().getOperations().getExpire(ticket)&nbsp;<&nbsp; 20){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.opsForValue().set(ticket,values, 10L,&nbsp;TimeUnit.MINUTES);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(SignUtils.getTimestamp());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断是否重复访问,存在重放攻击的时间窗口期
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(SignUtils.getTimestamp()&nbsp;-&nbsp;Long.valueOf(ts)&nbsp;>&nbsp; 600){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "success", false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "message", "Overtime&nbsp;to&nbsp;connect&nbsp;to&nbsp;server");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "code", "1002");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;printWriter&nbsp;=&nbsp;response.getWriter();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printWriter.write(jsonObject.toJSONString());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //验证签名
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;(!SignUtils.checkSign(request,sign)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "success", false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "message", "sign&nbsp;is&nbsp;invalid");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "code", "1003");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;printWriter&nbsp;=&nbsp;response.getWriter();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printWriter.write(jsonObject.toJSONString());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "success", false);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "message", "ticket&nbsp;is&nbsp;invalid,Relogin.");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsonObject.put( "code", "1004");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;printWriter&nbsp;=&nbsp;response.getWriter();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printWriter.write(jsonObject.toJSONString());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; false;
&nbsp;&nbsp;&nbsp;&nbsp;}
}

访问

先登录系统,获取合法的ticket

460332c1b3c8de5efeeca515c0843728.jpeg

生成一个合法的sign验证,获取测试ts,访问openDemo,即可正常访问。还可以将参数加密,将http换成https,就不一 一展开了。

12cd06003ce92cdb637d3386caf5bfa6.jpeg

demo代码

https://github.com/hwc4110/spring-demo1221

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《JSP程序设计从入门到精通》电子书   第1篇 入门篇 7   第1章 Jsp概述 技术分析 7    1.1 Jsp简介与历史背景 7    1.1.1 日新月异的Web技术 7    1.1.2 什么是JSP 8    1.1.3 JSP技术有以下几个显著的优点 9    1.1.4 JSP和其他类似或相关技术的一个简单比较 10    1.2 JSP环境安装配置 12    1.2.1Tomcat下JSP环境的配置 12    1.2.1建立自己的Jsp工作目录 13    1.3 JSP语法介绍 14    1.3.1 JSP页面中的元素 14    1.3.2 JSP语法概要 15    1.3.3关于模板文本(静态HTML) 16    1.4 运行第一个Jsp程序 16    1. 5本章小结 20   第2章Jsp 基础学习 20    2.1 JSP基本语法 20    2.1.1 JSP 语法之声明 21    2.1.2 JSP 语法之表达式 21    2.1.3 JSP 语法之Scriptlet 21    2.2 JSP的指令 22    2.2.1 page指令(Directive) 22    2.2.2 include指令(Directive) 24    2.3 JSP的动作 25    2.3.1 jsp:include动作 25    2.3.2 jsp:useBean动作 27    2.3.3 jsp:setProperty动作 29    2.3.4 jsp:getProperty动作 30    2.3.5 jsp: forward动作 31    2.3.6 jsp: plugin动作 31    2.3.7注释 31    2.4 JSP 9种基本内置组件 31    2.5 JSP中Session的使用 34    2.6 JSP中forward的使用 36    2.7 JSP运行时错误处理与应该注意的六个常见问题 37    2.8 JSP小实例 38    2.8.1实例1(在JSP中定义函数) 38    2.8.2实例2(获取各种CGI环境变量) 39    2.8.3实例3(JSP里request变量列表) 42    2. 9本章小结 44   第3章JavaBean组件 44    3.1 什么是JavaBeans 45    3.1.1 JavaBeans 简介 45    3.1.2 JavaBeans 属性 45    3.1.3 JavaBeans 的事件 50    3.2 在Jsp中使用JavaBeans 55    3.3 JavaBeans的scope属性 57    3.4 JavaBeans应用实例 59    3.4.1 实例1(HelloWord.java) 59    3.4.2 实例2(People.java) 60    3.4.3实例子3数组应用 (Example2_3.java) 60    3.4.4实例子4运算符、表达式应用 (Example3_1.java) 61    3.5 本章小结 62   第4章Jsp与Servlet 62    4.1 什么是Servlets 63    4.1.1 JavaServlet的解释 63    4.1.2 什么是Jsp 65    4.1.3 得到一个Servlets和JSP的运行环境 66    4.1.4 实现第一个JSP和SERVELT 67    4.2 Servlet规范定义的Servlet 生命周期 70    4.3 JSP/Servlet的重定向技术综述 72    4.3.1 RequestDispatcher.forward() 72    4.3.2 response.sendRedirect() 73    4.4 理解会话 74    4.4.1 会话状态跟踪API 75    4.4.2 在会话对象中保存数据 76    4.4.3实例:显示会话信息 76    4.5 用Java Servlets代替CGI 78    4.6 JSP/Servlet 中的汉字编码问题 80    4.7 图解Eclipse+Tomcat集成开发Servlet 84    4.8 Servlets/JSP开发技术问答 93    4.9 Servlet小实例 97    4.5.1实例1(输出) 98    4.5.2实例2(获取表单参数) 99    4.5.3实例3(获取jsp各种参数) 101    4.1
项目号 版本 OA系统 概要设计说明书 2017年 5 月 20 日 版本历史 "日期 "版本 "说明 "作者 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 目 录 1. 引言 4 1.1. 编写目的 4 1.2. 项目背景 4 1.3. 适用范围 4 1.4. 术语和缩略语 4 1.5. 参考资料 5 2. 总体设计 5 2.1. 运行环境 5 2.1.1. 硬件环境 5 2.1.2. 软件环境 5 2.2. 开发环境 5 2.2.1. 硬件环境 5 2.2.2. 软件环境 6 2.3. 总体结构设计 6 2.3.1. 系统体系架构 6 2.3.2. 系统功能架构 7 2.3.3. 系统部署架构 7 2.3.4. 系统软件架构 8 3. 系统功能设计 8 3.1. 功能模块列表 8 3.2. 系统菜单 9 3.3. 个人事项 10 3.3.1. 待办公文 10 3.3.2. 已办公文 12 3.3.3. 待阅公文 12 3.4. 公文起草 12 3.4.1. 外部来文登记 12 3.4.2. 司内申请 12 3.4.3. 司内请示 13 3.4.4. 报送办领导 13 3.4.5. 草稿箱 13 3.5. 基础管理 13 3.5.1. 类型设置 13 3.5.2. 流程设置 15 3.5.3. 文单设置 15 3.5.4. 文号设置 16 3.5.5. 批示设置 16 3.6. 系统管理 17 3.6.1. 功能需求用例 17 3.6.2. 用例描述 17 3.6.2.1. 用户 17 3.6.2.2. 组织机构 18 3.6.2.3. 部门 18 3.6.2.4. 用户 19 3.6.2.5. 组 19 3.6.2.6. 权限 19 3.6.2.7. 角色 19 3.6.2.8. 功能模块 20 3.6.2.9. 功能权限 20 3.6.2.10. 页面元素权限 21 3.6.3. 用户管理 21 3.6.4. 角色管理 21 3.6.5. 权限管理 21 3.6.6. 组织管理 21 3.6.7. 菜单管理 21 3.6.8. 字典管理 21 3.6.9. 自定义列表 22 3.6.10. 自定义菜单 22 4. 系统接口设计 22 4.1.1. 接口1 22 4.1.2. 接口2 22 5. 数据结构设计 22 6. 系统出错处理 24 6.1. 出错信息 24 6.2. 补救措施 25 6.3. 系统维护设计 25 7. 性能与安全设计 26 7.1. 系统性能 26 7.2. 系统安全 27 引言 1 编写目的 OA系统概要设计说明书是在客户提出的需求基础上,经过对OA系统需求规格说明书和 系统原型的分析和系统设计编写而成。用于将系统相关需求转换为未来系统的设计,提 交软件研发部门相关实现团队作为系统研发的依据和指南。 2 项目背景 根据电子公文管理总体要求,在现有信息化OA系统建设的基础上,要求完善电子公 文办理系统和交换系统,建设支持大并发和多级管理模式的协同办公平台,实现高效的 业务协作和信息共享,增强电子文件的完整性、可靠性、可用性和安全。基于此现状, 万达公司根据自动化系统总体要求,拟建设"统一规范、稳定安全、协同共享"的OA管理 系统,实现电子文件管理规范与信息化的全面融合,本文是基于对于新版OA管理信息系 统的基本设想和总体需求的理解基础上,形成的设计文档 3 适用范围 本文档适用于所有与本项目有关的软件设计、开发阶段相关人员,主要包括项目组成 员、研发经理、开发人员,项目管理人员,测试人员以及在以后想对系统进行扩展和维 护的相关人员等。 4 术语和缩略语 "术语、缩略语 "说明 " " " " " " " 5 参考资料 《软件需求规格说明书》 《OA系统原型》 总体设计 1 运行环境 1 硬件环境 1) 应用服务器: 2) 数据库服务器: 2 软件环境 1) 操作系统: Radhat Linux 6.0 数据库系统: ORACLE10I 中间件:Tomcat、Jboss 通信协议:http 客户端浏览器:IE9 2 开发环境 1 硬件环境 1) 应用服务器: 2) 数据库服务器: 2 软件环境 1) 操作系统:Win2003、Win7 2) 数据库系统:ORACLE10I 3) 开发平台及工具:炎黄Eclipse 4) 通信协议:http: 5) 客户端浏览器:IE9以上、Chrome 3 总体结构设计 1 系统体系架构 图2-1 OA系统体系架构图 2 系统功能架构 图2-2 OA系统功能架构图 3 系统部署架构 4 系统软件架构 5 核心业务对象 6 核心业
文明施工检查标准和应用实例(表3.0.3) 落地式脚手架检查标准和应用实例(表3.0.4-1) 吊篮脚手架检查标准和应用实例(表3.0.4-5) 附着式升降脚手架(整体提升架或爬架) 检查标准和应用实例(表3.0.4-6) 基坑支护安全检查标准和应用实例(表3.0.5) 模板工程安全检查标准和应用实例(表3.0.6) “三宝”、“四口”防护检查标准和应用实例(表3.0.7) 悬挑式脚手架检查标准和应用实例(表3.0.4-2) 物料提升机(龙门架、井字架)检查标准和应用实例(表3.0.9) 外用电梯(人货两用电梯)检查标准和应用实例(表3.0.10) 塔吊检查标准和应用实例(表3.0.11) 施工用电检查标准和应用实例(表3.0.8) 起重吊装检查标准和应用实例(表3.0.12) 施工机具检查标准和应用实例(表3.0.13) 文明施工检查标准和应用实例 表3.0.3 按照167号国际劳工公约《施工安全与卫生公约》的要求,施工现场不但应该做到安全生产不发生事故,同时还应做到文明施工,整齐有序,为此,本标准将现场围挡、封闭管理,施工场地,材料堆放、现场住宿、现场防火等列作保证项目作为检查重点。表中凡是“不符合卫生要求”的条款均以国家及当地卫生部门颂发的有关规定、标准为依据。高层建筑是指30m以上的建筑物,应随层设消防水源管道,用2寸立管,设加压水泵,每层留有消防水源接口。 一、场围挡 1、市区主要路段(含机场、码头、车站)沿街工地围挡高度应不低于2.5m。 2、市区一般路段的工地周围围挡高度应不低于1.8m。 3、挡应采用砌块、夹板、瓦楞板、彩钢板等坚固、稳定、整洁美观的硬质材料。围挡等临设施工应有详图,详图中应反映出围挡位置、高度、材质、基础、压顶、涂料颜色等要素。围挡设计时,宜结合工程概况、企业业绩、门头企业标志等,统筹考虑。 4、围挡应沿工地一周连续设置,结合工地内施工便道和周围环境设置主大门及附门。围挡不应超建筑红线,若因施工需要,在办理好相应许可证的前提下,可超红线,临时占用人行道等。 二、管理 1、施工现场的出入口应设置大门,一般宜设置无横梁的大门,有横梁的大门 2、高度应考虑运输车辆的装载通行高度。 3、施工现场应设立门卫,并制定门卫制度。 4、进入施工现场应佩戴工作卡,并且用不同的工作卡标志各工种人员。 5、大门应设置统一的企业标志。 三、施工场地 1、工地地面应硬地化处理,硬地化处理是在打桩、基础施工前浇筑混凝土地面,留出打桩孔和泥浆沟渠,并将施工机械置于地面上作业,方能有效地控制泥浆的污染。结合考虑成本因素,泥浆车辆、建筑材料车辆行走干道混凝土地面厚度应在150mm左右;群桩部位的混凝土地坪厚度应在80mm左右;桩位较稀的部位混凝土地坪厚度应在50mm左右,也可采用振动灌浆地坪。 根据施工场地,建筑物位置、围护结构位置等要素设计出基础阶段的现场布置图。根据现场布置图进行便道施工,施工便道应贯通整个工地。施工便道设计施工应注意以下几点:①应向明沟方向泛水。②留出围护结构位置,等围护结构完成后补浇余下部分,防止围护施工时,破坏
2021年网络安全政策、标准、报告及白皮书汇总,74份网络安全行业资源,供大家学习参考。 文件存储在网盘,需要可下载参阅。 一、法规 数据安全法 二、行业政策 1. 管理规定 全国一体化大数据中心协同创新体系算力枢纽实施方案 涉密信息系统集成资质管理办法 网络犯罪案件规定 2. 金融 征信业务管理办法(征求意见稿) 监管数据安全管理办法(试行) 保险中介机构信息化工作监管办法 网络交易监督管理办法 3.教医旅 教育部关于加强新时代教育管理信息化工作的通知 国家医疗保障局关于加强网络安全和数据保护工作的指导意见 交通运输数据共享管理办法 4. 电信 互联网信息服务管理办法(修订草案征求意见稿) “双千兆”网络协同发展行动计划(2021-2023年) 移动互联网应用程序个人信息保护管理暂行规定(征求意见稿) 常见类型移动互联网应用程序必要个人信息范围规定 5. 能源 2021年电力安全监管重点任务 核动力厂网络安全技术政策(试行) 6. 工业 工业互联网创新发展行动计划(2021-2023年) 工业互联网标识管理办法 三、技术标准 《网络视听收视大数据技术规范 第2部分:数据元素集》 《广播电视网络安全等级保护基本要求》 《信息安全技术 网络安全态势感知通用技术要求》(征求意见稿) 网络关键设备安全技术要求 通用要求(报批稿) 信息安全技术 网络安全等级保护大数据基本要求 信息安全技术 信息系统密码应用基本要求 信息安全技术 系统安全工程 能力成熟度模型 信息安全技术 保护轮廓和安全目标的产生指南 信息安全技术 XML数字签名语法与处理规范 信息技术 安全技术 网络安全 第1部分:综述和概念 信息技术 安全技术 网络安全 第2部分:网络安全设计和实现指南 信息安全技术 网络安全漏洞标识与描述规范 信息安全技术 网络安全漏洞管理规范 信息安全技术 网络安全漏洞分类分级指南 信息安全技术 轻量级鉴别与访问控制机制 信息安全技术 网络产品和服务安全通用要求 信息安全技术 个人信息安全影响评估指南 信息安全技术 代码安全审计规范 信息安全技术 信息共享 数据安全技术要求 信息安全技术 服务器安全技术要求和测评准则 《网络视听收视大数据技术规范 第1部分:总体要求》 《网络视听收视大数据技术规范 第3部分:接口》 《广播电视和网络视听收视综合评价数据脱敏规则》 《互联网电视总体技术要求》 《互联网电视集成平台技术要求》 互联网电视内容服务平台技术要求 金融数据安全 数据生命周期安全规范 四、产业报告及白皮书 中国信创产业发展白皮书(2021) 智慧城市白皮书(2021) 我国关键信息基础设施安全保护白皮书 数字化时代零信任安全蓝皮报告(2021年) 数据安全治理白皮书3.0 金融行业信息化转型基于飞腾生态解决方案白皮书0705 关键软件领域人才白皮书(2020年) 2021年信创产业发展报告 2021年开源软件供应链安全风险研究报告 数据价值化与数据要素市场发展报告 《2020网信自主创新调研报告》 区块链与数据安全治理白皮书 中国数字经济发展白皮书 十种数据存储加密白皮书V1.8 《国家数据资源调查报告(2020)》 数字时代治理现代化研究报告 行标版与国标版对比2021.3.30 2019-2020商用密码行业分析报告 5G网络安全标准化白皮书 2020年度互联网企业信息科技风险治理现状调研报告 大数据平台安全研究报告 2020企业安全威胁统一应对指南 中国信创产业发展白皮书 《数据共享开放安全研究报告》 《2021中国网络视听发展研究报告》 《2020年工业信息安全态势报告》
资源介绍:基于Spring Boot开发的家具商城系统 本次为大家带来的资源是一款基于Spring Boot框架开发的家具商城系统,此系统不仅具有完善的电商功能,还特别针对家具行业的特点进行了深度定制,旨在帮助家具企业快速搭建起一个功能强大、操作简便的在线销售平台。 系统核心功能涵盖了商品展示、购物车管理、订单处理、会员注册登录等电商系统的基本要素,特别值得一提的是,针对家具商品,系统加入了详细的产品参数展示、3D效果预览、定制化选购等特色功能,极大提升了用户的购物体验。此外,系统还提供了丰富的后台管理功能,方便管理员对商品、订单、会员等进行高效管理。 在技术实现上,系统采用了Spring Boot作为后端框架,其快速、简捷的特点使得系统的开发效率得到了显著提升。同时,系统还集成了Spring Security、MyBatis等主流技术,保证了系统的安全性和稳定性。前端则采用了响应式设计,使得系统能够在不同设备上都能够呈现出良好的视觉效果和用户体验。 此家具商城系统不仅是一个完整的电商解决方案,更是一个优秀的二次开发平台。系统提供了丰富的API接口和可扩展的架构,使得开发者可以根据实际需求进行定制开发,轻松实现功能的扩展和定制。 总的来说,这款基于Spring Boot开发的家具商城系统是一款功能强大、易于扩展的电商系统,无论是对于家具企业还是对于开发者来说,都是一个不可多得的好资源。
《嵌入式系统设计实战:基于飞思卡尔S12X微控制器》以飞思卡尔半导体公司(原摩托罗拉半导体部)16位S12X系列微控制器中MC9S12XS128为蓝本阐述嵌入式系统的软件与硬件设计。全书共11章,其中第1章阐述嵌入式系统的知识体系、学习误区与学习建议。第2章给出XS128硬件最小系统,并简要介绍S12XCPU(CPU12X)。第3章给出第一个样例程序及CodeWai·“or工程组织,完成第一个S12X工程的入门。第4章给出基于硬件构件的嵌入式系统开发方法。第5章阐述串行通信接口SCI,并给出第一个带中断的实例。1~5章介绍了学习一个新MCU完整要素(知识点)的入门。6~12章分别介绍GPIO的应用(键盘、LED及LCD)、定时器(含PWM)、串行外设接口SPI、Flash存储器在线编程、CAN总线、A/D转换及S12XS128其他模块等。附录给出相关资料。《嵌入式系统设计实战:基于飞思卡尔S12X微控制器》涉及的实例源程序、辅助资料、相关芯片资料及常用软件工具,可在北航出版社下载中心或苏州大学飞思卡尔嵌入式系统研发中心网站下载。《嵌入式系统设计实战:基于飞思卡尔S12X微控制器》可供大学有关专业的高年级学生和研究生用作教材或参考读物,也可供嵌入式系统开发与研究人员用作参考和进修资料。 第1章 概述 1 1.1 嵌入式系统定义、由来及特点 1 1.1.1 嵌入式系统的定义 1 1.1.2 嵌入式系统的由来及其与微控制器的关系 2 1.1.3 嵌入式系统的特点 3 1.2 嵌入式系统的知识体系、学习误区及学习建议 4 1.2.1 嵌入式系统的知识体系 4 1.2.2 嵌入式系统的学习误区 5 1.2.3 基础阶段的学习建议 8 1.3 嵌入式系统常用术语 10 1.3.1 与硬件相关的术语 10 1.3.2 与通信相关的术语 11 1.3.3 与功能模块及软件相关的术语 12 1.4 嵌入式系统常用的C语言基本语法 13 第2章 S12X系列MCU硬件最小系统及CPU12X 26 2.1 S12X系列MCU概述及型号标识 26 2.1.1 S12X系列MCU概述 26 2.1.2 S12X系列MCU型号标识 28 2.2 S12X系列MCU的功能及存储器映像 29 2.2.1 S12X系列MCU的功能 30 2.2.2 S12X系列MCU的存储器映像及特点 31 2.3 XS128的引脚功能及硬件最小系统 36 2.3.1 XS128(80引脚QFP封装)的引脚功能 37 2.3.2 XS128的硬件最小系统 40 2.3.3 硬件最小系统的焊接与测试步骤 43 2.4 CPU12X的内部寄存器 44 2.5 CPU12X的寻址方式 47 2.6 CPU12X指令系统概要 51 2.6.1 数据传送类指令 53 2.6.2 算术运算类指令 56 2.6.3 逻辑运算类与位操作类指令 60 2.6.4 程序控制类指令 63 2.6.5 其他类指令 71 2.7 CPU12X汇编语言基础 72 2.7.1 S12X汇编源程序格式 72 2.7.2 S12X汇编语言伪指令 74 第3章 第一个样例程序及CodeWarrior工程组织 77 3.1 通用I/O接口基本概念及连接方法一 77 3.2 XS128的GPIO寄存器与GPIO构件封装 79 3.2.1 XS128的GPIO寄存器 79 3.2.2 GPIO的简单编程方法 83 3.3 CodeWarrior开发环境与S08/S12/ColdFire三合一写入器 84 3.3.1 CodeWarrior开发环境简介与基本使用方法 85 3.3.2 S08/S12/ColdFire三合一写入器 86 3.3.3 MC9S12XS128硬件评估板 87 3.4 CW环境C语言工程文件的组织 87 3.4.1 工程文件的逻辑组织结构 88 3.4.2 工程文件的物理组织结构 90 3.4.3 系统启动及初始化相关文件 91 3.4.4 芯片初始化、主程序、中断程序及其他文件 98 3.4.5 机器码文件(s19文件)的简明解释 101 3.4.6 lst文件与map文件 103 3.4.7 如何在CW环境下新建一个S12工程 105 3.5 第一个C语言工程:控制小灯闪烁 105 3.5.1 GPIO构件设计 106 3.5.2 Light构件设计 113 3.5.3 Light测试工程主程序 115 3.5.4 理解第一个C工程的执行过程 116 3.6 第一个汇编语言工程:控制小灯闪烁 117 3.6.1 汇编工程文件的组织 118 3.6.2 Light构件汇编程序 122 3.6.3 Light测试工程主程序 124 3.6.4 理解第一个汇编工程的执行过程 126 第4章 基于硬件构件的嵌入式系统开发方法 129 4.1 嵌入式系统开发所遇到的若干问题 129 4.2 嵌入式硬件构件的基本思想与应用方法 130 4.3 基于硬件构件的嵌入式系统硬件电路设计 131 4.3.1 设计时需要考虑的基本问题 131 4.3.2 硬件构件化电路原理图绘制的简明规则 133 4.3.3 实验PCB板设计的简明规则 135 4.4 基于硬件构件的嵌入式底层软件构件的编程方法 139 4.4.1 嵌入式硬件构件和软件构件的层次模型 139 4.4.2 底层构件的实现方法与编程思想 140 4.4.3 硬件构件及底层软件构件的重用与移植方法 141 第5章 串行通信接口SCI 144 5.1 异步串行通信的通用基础知识 144 5.1.1 串行通信的基本概念 145 5.1.2 RS-232总线标准 146 5.1.3 TTL电平到RS-232电平转换电路 148 5.1.4 串行通信编程模型 149 5.2 SCI模块的编程寄存器 150 5.3 SCI编程实例 155 5.3.1 SCI初始化与收发编程的基本方法 156 5.3.2 SCI构件设计与测试实例 157 5.4 XS128的中断源与第一个带有中断的编程实例 166 5.4.1 中断与异常的通用知识 166 5.4.2 XS128的中断机制 166 5.4.3 XS128的中断编程方法 171 5.4.4 XS128的中断优先级编程实例 173 第6章 GPIO的应用实例:键盘、LED与LCD 175 6.1 键盘技术概述 175 6.1.1 键盘模型及接口 175 6.1.2 键盘编程的基本问题 177 6.1.3 键盘构件设计与测试实例 178 6.2 LED技术概述 184 6.2.1 扫描法LED显示编程原理 184 6.2.2 LED构件设计与测试实例 186 6.3 LCD技术概述 191 6.3.1 LCD的特点和分类 191 6.3.2 点阵字符型液晶显示模块 193 6.3.3 HD44780 193 6.3.4 LCD构件设计与测试实例 199 第7章 定时器相关模块 207 7.1 计数/定时器的基本工作原理 207 7.2 定时器模块的基本编程方法与实例 208 7.2.1 定时器模块计时功能的基本寄存器 210 7.2.2 定时器构件设计与测试实例 212 7.3 定时器模块输入捕捉功能的编程方法与实例 216 7.3.1 输入捕捉的基本含义 216 7.3.2 输入捕捉的寄存器 217 7.3.3 输入捕捉构件设计与测试实例 218 7.4 定时器模块输出比较功能的编程方法与实例 221 7.4.1 输出比较的基本知识 222 7.4.2 用于输出比较功能的相关寄存器 222 7.4.3 输出比较构件设计与测试实例 224 7.5 定时器模块脉冲累加功能的编程方法与实例 226 7.5.1 脉冲累加的基本知识 226 7.5.2 脉冲累加功能的相关寄存器 227 7.5.3 脉冲累加器构件设计 228 7.6 脉宽调制模块 231 7.6.1 PWM工作原理 231 7.6.2 XS128的PWM的特点及模块框图 232 7.6.3 脉宽调制模块PWM相关寄存器 233 7.6.4 PWM构件设计及测试实例 236 7.7 周期中断定时器模块PIT 243 7.7.1 PIT模块功能描述 243 7.7.2 PIT模块的编程寄存器 245 7.7.3 PIT构件设计与测试实例 248 第8章 A/D与SPI 252 8.1 A/D通用知识 252 8.1.1 A/D的基本问题 252 8.1.2 A/D转换器 253 8.1.3 A/D转换常用传感器简介 254 8.1.4 电阻型传感器采样电路设计 255 8.2 A/D模块的编程寄存器 257 8.3 A/D模块编程方法与实例 264 8.3.1 A/D模块基本编程方法 264 8.3.2 A/D构件设计与测试实例 265 8.4 SPI的基本工作原理 270 8.4.1 SPI基本概念 270 8.4.2 SPI的数据传输 272 8.4.3 SPI模块的时序 272 8.4.4 模拟SPI 276 8.5 SPI模块的编程寄存器 276 8.6 SPI构件设计与测试实例 282 第9章 Flash存储器在线编程 289 9.1 S12X系列MCU的Flash存储器的特点及分页机制 289 9.1.1 S12X系列MCU的Flash存储器的特点 290 9.1.2 XS128的Flash存储器分页机制 290 9.2 Flash存储器编程方法 295 9.2.1 Flash存储器编程的基本概念 295 9.2.2 Flash存储器的编程寄存器 296 9.2.3 FCCOB-NVM命令模式 300 9.2.4 Flash存储器的编程步骤 301 9.3 D-Flash在线编程 303 9.4 P-Flash在线编程 308 9.5 Flash存储器的保护特性和安全性 313 9.5.1 Flash存储器的配置区域 313 9.5.2 Flash存储器的保护特性 314 9.5.3 Flash存储器的安全性 317 第10章 CAN总线 321 10.1 CAN总线通用知识 321 10.1.1 CAN总线协议的历史概况 321 10.1.2 CAN硬件系统的典型电路 321 10.1.3 CAN总线的有关基本概念 324 10.1.4 帧结构 327 10.1.5 位时间 331 10.2 MSCAN模块简介 332 10.2.1 MSCAN特性 333 10.2.2 报文存储结构、标识符验收过滤与时钟系统 334 10.2.3 CAN模块的主要运行模式、低功耗选项、中断与响应 341 10.3 MSCAN模块的内存映射及寄存器定义 345 10.3.1 MSCAN模块内存映射 345 10.3.2 MSCAN模块寄存器 346 10.4 MSCAN模块双机通信测试实例 360 10.4.1 测试模型 360 10.4.2 编程要点 360 10.4.3 CAN模块底层构件设计 361 10.4.4 测试操作要点 374 10.5 MSCAN模块的自环通信实例 374 10.5.1 测试模型 374 10.5.2 编程要点及设计代码 374 第11章 系统时钟与其他功能模块 378 11.1 时钟与复位产生模块概述 378 11.1.1 锁相环技术 378 11.1.2 CRG模块框图 380 11.1.3 CRG模块的工作模式 381 11.1.4 XS128内部锁相环结构 383 11.2 XS128的CRG模块的初始化 384 11.2.1 XS128的CRG模块寄存器 384 11.2.2 初始化编程方法与实例 389 11.3 CRG模块的其他功能 392 11.3.1 CRG产生复位信号 392 11.3.2 中断 397 11.4 XS128的IRQ、XIRQ引脚、RTIBRK及SWI中断 398 11.4.1 IRQ与XIRQ引脚中断 398 11.4.2 实时中断 398 11.4.3 调试模块DBG与软件中断SWI指令 399 附录A XS128的映像寄存器 400 附录B S08/S12/ColdFireBDM简明使用方法 410 附录C 常见实践问题集锦 414 附录D XS128的C语言函数库 417 附录E XS128的中断源与中断向量表 421 参考文献 424

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值