提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、创建自定义异常类
  • 二、封装Web返回对象
  • 三、配置后端验证功能
  • 四、 抵御即跨站脚本(XSS)攻击
  • 五、 创建过滤器,把所有请求对象传入包装类
  • 六、 给主类添加注解

前言

本章包括框架基础配置,自定义异常类,封装Web返回对象,配置后端验证功能,抵御即跨站脚本(XSS)攻击等

一、创建自定义异常类

因为后台Java项目是Web工程,所以有异常消息,我们要在原有异常消息的基础之上,封装状态码,所以需要我们自己创建一个异常类。
自定义异常类继承的父类,我没有选择Exception。因为Exception类型的异常,我们必须要手动显式处理,要么上抛,要么捕获。我希望我定义的异常采用既可以采用显式处理,也可以隐式处理,所以我选择继承RuntimeException这个父类。RuntimeException类型的异常可以被虚拟机隐式处理,这样就省去了我们很多手动处理异常的麻烦。

@Date
public class EmosException extends RuntimeException{private String msg;private int code = 500;public EmosException(String msg){super(msg);this.msg = msg;
}
public EmosException(String msg,Throwable e){super(msg,e);this.msg = msg;
}
public EmosException(String msg,int code){super(msg);this.msg = msg;this.code = code;}
public EmosException(String msg,int code,Throwable,e){super(msg,e);this.msg = msg;this.code = code;}
}

二、封装Web返回对象

虽然SpringMVC的Controller可以自动把对象转换成JSON返回给客户端,但是我们需要制定一个统一的标准,保证所有的Controller返回的数据格式一致。
创建R类

public class R extends HashMap<String,Object>{public R(){put("code",HttpStatus.SC_OK);put("msg","success");
}public static R error(){return error(HttpStatus.SC_INTERNAL_ERROR,"未知异常,请联系管理员");
}public static R error(String msg){return error(HttpStatus.SC_INTERNAL_ERROR,msg);
}public static R error(int code ,String msg){R  r = new R();r.put("msg",msg);r.put("code",code);return r;
}public static R ok(String msg){R r = new R();r.put("msg",msg);return r;
}public static R ok(Map<String,Object> map){R r = new R();r.putAll(map);return r;
}public static R ok(){return new R();
}public static R put(String key,Object value){super.put(key,value);return this;
}
}

三、配置后端验证功能

对于客户端提交的表单或者Ajax的数据,后端的Controller必须要做验证,才能使用这些数据,采用Validation库.
利用validation库在做后端验证的时候,要求使用Form封装类来保存客户端提交的数据,然后在封装类中,可以定义验证的规则,

@ApiModel
@Datapublic class TestSayHelloForm {@NotBlank@Pattern(regexp = "^[\\u4e00-\\u9fa5]{2,15}$")@ApiModelProperty("姓名")private String name;}
 @RestController@RequestMapping("/test")@Api("测试Web接口")public class TestController {@PostMapping("/sayHello")@ApiOperation("最简单的测试方法")
public R sayHello(@Valid @RequestBody TestSayHelloForm form){return R.ok().put("message","Hello,"+form.getName());}}

四、 抵御即跨站脚本(XSS)攻击

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
所以避免XSS攻击最有效的办法就是对用户输入的数据进行转义,然后存储到数据库里面。等到视图层渲染HTML页面的时候。转义后的文字是不会被当做JavaScript执行的,这就可以抵御XSS攻击。
1.导入依赖库
因为 Hutool 工具包带有XSS转义的工具类,所以我们要导入 Hutool ,然后利用 Servlet 规范
提供的请求包装类,定义数据转义功能。

 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.0</version>
</dependency>

2.定义请求包装类

pulic class XssHttpServletRequestWrapper extends HttpServlertRequestWrapper{public XssHttpServletRequestWrapper(HttpServletRequest request){super(request);
}@Overridepublic String getParameter(String name){String value = super.getParameter(name);if(!StrUtil.hasEmpty(value)){value = HtmlUtil.filter(value);
}
@Override
public String[] getParameterValues(String name){String[] values=super.getParameterValues(name);if(values != null){for(int i=0;i<values.length;i++){String value = values[i];if(!StrUtil.hasEmpty(value)){value=HtmlUtil.filter(value);
}values[i] = value;
}}return values;
}
@Override
public Mao<String,String[]> getParameterMap(){Map<String,Stirng[]> parameters = super.getParameterMap();Map<String,Stirng[]> map= new LinkedHashMap<>();if(parameters != null){for(String key : parameters.keySet()){String[] values = paramters.get(key);for(int i=0;i<values.length;i++){String value = values[i];if(!StrUtil.hasEmpty(value)){value =  HtmlUtil.filter(value);
}    value[i] = value;
}map.put(key,values);}
}return map;
}
@Override
public String getHeader(String name){String value = super.getHeader(name);if(StrUtil.hasEmpty(value)){value = HtmlUtil.filter(value);
}return value;
}
@Override
public ServleInputStream getInputStream() throws IOException{InputStream in = super.getInputStream();StringBuffer body = new StringBuffer();InputStreamReader reader = new InputStreamReader(in,Charset.forName("UTF-8"));BufferedReader buffer = new BufferedReader(reader);String line = buffer.readLine();while(line != null){body.append(line);line = buffer.readLine();
}buffer.close();reader.close();in.close();Map<String,Object> map = JSONUtil.parseObj(body.toString());Map<String,Object> resultMap = new HashMap(map.size());for(String key : map.keySet()){Object val = map.get(key);if(map.get(key) instanceof String){resultMap.put(key,HtmlUtil.filter(val.toString()));}else{resultMap.put(key,val);
}
}String str = JSONUtil.toJsonStr(resultMap);
final ByteArrayInputStream bain = new ByteArrayInputStream(str.getBytes());return new ServletInputStream() {@Overridepublic int read() throws IOException {return bain.read();
}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}
@Overridepublic void setReadListener(ReadListener listener) {}
}
}
}

五、 创建过滤器,把所有请求对象传入包装类

为了让刚刚定义的包装类生效,我们还要创建XssFilter 过滤器。过滤器拦截所有请求,然后把请求传入包装类,这样包装类就能覆盖所有请求的参数方法,用户从请求中获得数据,全都经过转义。

@WebFilter(urlPatterns = "/*")
public class XssFilter implements Filter{public void init(FilterCongfig config) throws ServletException {}
public volid doFilterServletRequest request, ServletResponse response, FilterChain
chain){XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
}@Overridepublic void destroy(){}
}

六、 给主类添加注解

给SpringBoot主类添加 @ServletComponentScan 注解。

1(基于SpringBoot)疫情下的在线办公签到系统-从零构建后端项目基础篇相关推荐

  1. 5.(人脸签到)疫情下的在线办公签到系统-进阶篇

    文章目录 签到业务流程说明 一.获取定位地址 二.在Docker中安装人脸识别镜像 三.运行人脸识别程序 四.实现人脸签到(持久层) 五.实现人脸签到(业务层) 1.判断签到用户是否存在人脸模型 六. ...

  2. 4.(人脸签到篇)疫情下的在线办公签到系统-基础篇

    文章目录 设计人脸签到页面 一.实现签到自拍功能 二.缓存系统常量数据 1.读取常量数据 三.封装检测当天是否可以签到(持久层) 三.封装检测当天是否可以签到(业务层) 四.封装检测当天是否可以签到( ...

  3. 基于springboot框架开发的在线点餐系统

    本系统后台基于springboot开发的在线点餐系统,系统以Java作为编程语言,采用Mysql数据库作为后台数据库. 系统分为商家和普通用户两大角色功能 商家后台功能如下:商家后台管理.菜单管理.订 ...

  4. 基于springboot的智慧学习(在线学习考试)系统

    博主主页:猫头鹰源码 博主简介:Java领域优质创作者.CSDN博客专家.公司架构师.全网粉丝5万+.专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等).简历模 ...

  5. java基于SpringBoot+Vue+nodejs的在线外卖订餐系统Element

    随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势社会的发展和科学技术的进步,互联网技术越来越受欢迎.网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每 ...

  6. springboot基于微信小程序的在线办公系统

    项目介绍 基于springboot的在线办公小程序.它是在Windows下,以MYSQL为数据库开发平台,java技术和Tomcat网络信息服务作为应用服务器.在线办公小程序的功能已基本实现,主要包括 ...

  7. 基于JAVA疫情下居家隔离服务系统计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA疫情下居家隔离服务系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA疫情下居家隔离服务系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S ...

  8. 基于SpringBoot和React的在线考试平台

    基于SpringBoot和React的在线考试平台-项目设计与分析 项目实战详细分析!!! 文章目录 1 系统背景和意义 1.1 系统背景 1.2 系统意义 2 系统分析 2.1 功能性需求 2.1. ...

  9. (附源码)基于SpringBoot小而学在线考试系统 毕业设计141507

    基于springboot小而学在线考试系统 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最 ...

最新文章

  1. ajax异步请求验证ua的网页,ajax 异步请求数据
  2. Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway.
  3. 阶段总结——201511
  4. hashlib 模块用来进行hash
  5. WdatePicker日期控件使用与值获取,以及选择日期完毕触发事件
  6. 花旗银行文章解释DeFi的好处
  7. [BZOJ2282]消防
  8. Linux下unzip乱码问题解决
  9. 遥感原理与应用_遥感原理与应用考试题库及答案
  10. 淘宝/天猫API:item_search_jupage-天天特价
  11. 【百度云提取】:JDK1.8API、Jdk1.8安装包、jQueryAPI文档、JavaScriptAPI文档、W3School相关API文档
  12. Luat合宙ESP32C3教程-点亮ST7735驱动1.8寸TFT液晶屏
  13. java 蓝牙打印_Android蓝牙打印机,带你真正了解各种打印格式
  14. 《JAVA语言程序设计》期末考试试题及答案
  15. Task 3 (p 104)
  16. 哈工大刘挺:自然语言处理中的可解释性问题!
  17. MATLAB读ArcGIS输出的dbf文件
  18. 5项目管理--项目范围管理
  19. 通过身体跳跃和蹲伏玩chromes dino游戏
  20. 当双十一的广告强行闯入生活

热门文章

  1. 小型、低成本、低功耗的一次性收音机。第1部分:发射机
  2. 021-MongoDB数据库从入门到放弃
  3. 《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记
  4. python模拟投掷色子并做出数据可视化统计图
  5. 作业~嗖嗖移动业务大厅
  6. 【SlowFast复现】SlowFast Networks for Video Recognition复现代码 使用自己的视频进行demo检测
  7. 弥散磁共振成像在神经科学中的应用
  8. 冷门指标移中平均线和多空指数的完美结合(一定要看)
  9. ubuntu系统下mysql数据库的备份与恢复
  10. C语言_学习笔记_(一)程序设计与C语言