当前位置: 首页 > news >正文

建设网站烧钱iis配置网站是什么

建设网站烧钱,iis配置网站是什么,wordpress短视频主题,在百度做推广需要网站吗Spring boot框架1、什么是Spring Boot#xff1f;​ Spring Boot是Spring开源组织下的子项目#xff0c;是Spring组件一站式解决方案#xff0c;主要是简化了使用Spring的难度#xff0c;简省了繁重的配置#xff0c;提供了各种启动器#xff0c;开发者能快速上手。Sprin…Spring boot框架1、什么是Spring Boot​ Spring Boot是Spring开源组织下的子项目是Spring组件一站式解决方案主要是简化了使用Spring的难度简省了繁重的配置提供了各种启动器开发者能快速上手。Spring Boot官方文档https://spring.io/projects/spring-boot/2、Spring Boot的优点与特点优点独立运行Spring Boot内嵌了各种servlet容器Tomcat、Jetty等不再需要打成war包部署到容器中Spring Boot只要打成一个可执行的jar包就能独立运行所有的依赖包都在一个jar包内简化配置spring-boot-starter-web启动器自动依赖其他组件简少了maven的配置。自动配置Spring Boot能根据当前类路径下的类、jar包来自动配置bean如添加一个spring-boot-starter-web启动器就能拥有web的功能无需其他配置无代码生成和XML配置Spring Boot配置过程中无代码生成也无需XML配置文件就能完成所有配置工作这一切都是借助于条件注解完成的这也是Spring4.x的核心功能之一。应用监控Spring Boot提供一系列端点可以监控服务及应用做健康检测。上手容易特点为 Spring 开发提供一个更快、更广泛的入门体验。开箱即用远离繁琐的配置。提供了一系列大型项目通用的非业务性功能例如内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。绝对没有代码生成也不需要XML配置。3、Spring Boot的配置文件以及之间的区别.properties 和 .yml它们的区别主要是书写格式不同。1).propertiesapp.user.name javastack2).ymlapp:user:name: javastack注.yml 格式不支持 PropertySource 注解导入配置。4、Spring Boot的常用注解SpringBootApplication申明让spring boot自动给程序进行必要的配置这个配置等同于Configuration EnableAutoConfiguration 和 ComponentScan 三个配置。ResponseBody表示该方法的返回结果直接写入HTTP response body中一般在异步获取数据时使用用于构建RESTful的api。在使用RequestMapping后返回值通常解析为跳转路径加上esponsebody后返回结果不会被解析为跳转路径而是直接写入HTTP response body中。比如异步获取json数据加上Responsebody后会直接返回json数据。该注解一般会配合RequestMapping一起使用。Controller用于定义控制器类在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口service层一般这个注解在类中通常方法需要配合注解RequestMapping。RestController用于标注控制层组件(如struts中的action)ResponseBody和Controller的合集。RequestMapping提供路由信息负责URL到Controller中的具体函数的映射。EnableAutoConfigurationSpringBoot自动配置auto-configuration尝试根据你添加的jar依赖自动配置你的Spring应用。例如如果你的classpath下存在HSQLDB并且你没有手动配置任何数据库连接beans那么我们将自动配置一个内存型in-memory数据库”。你可以将EnableAutoConfiguration或者SpringBootApplication :添加到一个Configuration类上来选择自动配置。如果发现应用了你不想要的特定自动配置类你可以使用EnableAutoConfiguration注解的排除属性来禁用它们。ComponentScan表示将该类自动发现扫描组件。个人理解相当于如果扫描到有Component、Controller、Service等这些注解的类并注册为Bean可以自动收集所有的Spring组件包括Configuration类。我们经常使用ComponentScan注解搜索beans并结合Autowired注解导入。可以自动收集所有的Spring组件包括Configuration类。我们经常使用ComponentScan注解搜索beans并结合Autowired注解导入。如果没有配置的话Spring Boot会扫描启动类所在包下以及子包下的使用了Service,Repository等注解的类。Configuration相当于传统的xml配置文件如果有些第三方库需要用到xml文件建议仍然通过Configuration类作为项目的配置主类——可以使用ImportResource注解加载xml配置文件。Import用来导入其他配置类。ImportResource用来加载xml配置文件。Service一般用于修饰service层的组件Repository使用Repository注解可以确保DAO或者repositories提供异常转译这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置同时也不需要为它们提供XML配置项。Value注入Spring boot application.properties配置的属性的值。示例代码Inject等价于默认的Autowired只是没有required属性Component泛指组件当组件不好归类的时候我们可以使用这个注解进行标注。Bean:相当于XML中的,放在方法的上面而不是类意思是产生一个bean,并交给spring管理。AutoWired自动导入依赖的bean。byType方式。把配置好的Bean拿来用完成属性、方法的组装它可以对类成员变量、方法及构造函数进行标注完成自动装配的工作。当加上requiredfalse时就算找不到bean也不报错。Qualifier当有多个同一类型的Bean时可以用Qualifier(“name”)来指定。与Autowired配合使用。Qualifier限定描述符除了能根据名字进行注入但能进行更细粒度的控制如何选择候选者具体使用方式如下Resource(name”name”,type”type”)没有括号内内容的话默认byName。与Autowired干类似的事。5、spring boot开启的两种方式​ ① 继承spring-boot-starter-parent项目parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.5.6.RELEASE/versionxml/parent​ ② 导入spring-boot-dependencies项目依赖dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion1.5.6.RELEASE/versiontypepom/typescopeimport/scope/dependency/dependencyManagementSpring Boot依赖注意点1、属性覆盖只对继承有效​ Spring Boot依赖包里面的组件的版本都是和当前Spring Boot绑定的如果要修改里面组件的版本只需要添加如下属性覆盖即可但这种方式只对继承有效导入的方式无效。propertiesslf4j.version1.7.25slf4j.version/properties如果导入的方式要实现版本的升级达到上面的效果这样也可以做到把要升级的组件依赖放到Spring Boot之前。dependencyManagementdependencies!-- Override Spring Data release train provided by Spring Boot --dependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-releasetrain/artifactIdversionFowler-SR2/versionscopeimport/scopetypepom/type/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion1.5.6.RELEASE/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement需要注意要修改Spring Boot的依赖组件版本可能会造成不兼容的问题。2、资源文件过滤问题使用继承Spring Boot时如果要使用Maven resource filter过滤资源文件时资源文件里面的占位符为了使${}和Spring Boot区别开来此时要用...包起来不然无效。另外...占位符在yaml文件编辑器中编译报错所以使用继承方式有诸多问题坑要慢慢趟。6、Spring Boot的几种运行方式打包用命令或者放到容器中运行用 Maven/ Gradle 插件运行直接执行 main 方法运行7、Spring Boot实现热部署第一种引用devtools依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdoptionaltrue/optional/dependency第二种自定义配置热部署# 热部署开关false即不启用热部署spring.devtools.restart.enabled: true# 指定热部署的目录#spring.devtools.restart.additional-paths: src/main/java# 指定目录不更新spring.devtools.restart.exclude: test/**第三种Intellij Idea修改​ 1、勾上自动编译或者手动重新编译​ File Settings Compiler-Build Project automatically​ 2、注册​ ctrl shift alt / Registry 勾选Compiler autoMake allow when app running注意事项1、生产环境devtools将被禁用如java -jar方式或者自定义的类加载器等都会识别为生产环境。2、打包应用默认不会包含devtools除非你禁用SpringBoot Maven插件的 excludeDevtools属性。3、Thymeleaf无需配置 spring.thymeleaf.cache:falsedevtools默认会自动设置参考完整属性。4、devtools会在windows资源管理器占用java进程在开发工具里面杀不掉只能手动kill掉不然重启会选成端口重复绑定报错。更多详细用法参考发官方文档https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html8、保护Spring Boot的应用方法在生产中使用HTTPS使用Snyk检查你的依赖关系升级到最新版本启动CSRF保护使用内容安全策略防止XSS攻击使用OpenID Connect进行身份验证管理密码使用面密码哈希安全地存储秘密使用OWASP的ZAP测试应用程序安全团队进行代码审查9、Spring Boot配置加载顺序2.01、properties文件2、YAML文件3、系统环境变量4、命令行参数等等……配置属性加载的顺序如下1、开发者工具 Devtools 全局配置参数2、单元测试上的 TestPropertySource 注解指定的参数3、单元测试上的 SpringBootTest 注解指定的参数4、命令行指定的参数如 java -jar springboot.jar --nameJava技术栈5、命令行中的 SPRING_APPLICATION_JSONJSON 指定参数, 如 java -Dspring.application.json{name:Java技术栈} -jar springboot.jar6、ServletConfig 初始化参数7、ServletContext 初始化参数8、JNDI参数如 java:comp/env/spring.application.json9、Java系统参数来源System.getProperties()10、操作系统环境变量参数11、RandomValuePropertySource 随机数仅匹配ramdom.*12、JAR包外面的配置文件参数application-{profile}.propertiesYAML13、JAR包里面的配置文件参数application-{profile}.propertiesYAML14、JAR包外面的配置文件参数application.propertiesYAML15、JAR包里面的配置文件参数application.propertiesYAML16、Configuration配置文件上 PropertySource 注解加载的参数17、默认参数通过 SpringApplication.setDefaultProperties 指定10、Spring Boot日志集成Spring Boot日志框架Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架如果你使用starters启动器Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架Spring Boot都支持配置将日志输出到控制台或者文件中。spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架。11、Spring Boot读取配置的几种方式读取application文件在application.yml或者properties文件中添加info.addressUSAinfo.companySpringinfo.degreehighValue注解读物方式import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;Componentpublic class InfoConfig1 {Value(${info.address})private String address;Value(${info.company})private String company;Value(${info.degree})private String degree;public String getAddress() {return address;}public void setAddress(String address) {this.address address;}public String getCompany() {return company;}public void setCompany(String company) {this.company company;}public String getDegree() {return degree;}public void setDegree(String degree) {this.degree degree;}}ConfigurationProperties注解读取方式ComponentConfigurationProperties(prefix info)public class InfoConfig2 {private String address;private String company;private String degree;public String getAddress() {return address;}public void setAddress(String address) {this.address address;}public String getCompany() {return company;}public void setCompany(String company) {this.company company;}public String getDegree() {return degree;}public void setDegree(String degree) {this.degree degree;}}读取指定文件资源目录下建立config/db-config.properties:db.usernamerootdb.password123456PropertySourceValue注解读取方式ComponentPropertySource(value { config/db-config.properties })public class DBConfig1 {Value(${db.username})private String username;Value(${db.password})private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}}注意PropertySource不支持yml文件读取。PropertySourceConfigurationProperties注解读取方式ComponentConfigurationProperties(prefix db)PropertySource(value { config/db-config.properties })public class DBConfig2 {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}}Environment读取方式以上所有加载出来的配置都可以通过Environment注入获取到。Autowiredprivate Environment env;// 获取参数String getProperty(String key);总结从以上示例来看Spring Boot可以通过PropertySource,Value,Environment,ConfigurationProperties来绑定变量。12、Spring Boot自动配置原理① SpringBoot启动的时候加载主配置类开启了自动配置功能EnableAutoConfiguration。② EnableAutoConfiguration的作用是利用AutoConfigurationImportSelector给容器中导入一些组件。③ 可以查看public String[] selectImports(AnnotationMetadata annotationMetadata)方法的内容。④ 通过protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)获取候选的配置这个是扫描所有jar包类路径下META-INF/spring.factories;⑤ 然后把扫描到的这些文件包装成Properties对象。⑥ 从properties中获取到EnableAutoConfiguration.class类名对应的值然后把他们添加在容器中。⑦ 整个过程就是将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到 容器中。⑧ 每一个这样XXAutoConfiguration类都是容器中的一个组件都加入到容器中用他们来做自动配置。每一个自动配置类进行自动配置功能以HttpEncodingAutoConfiguration为例解释自动配置原理⑨根据当前不同的条件判断决定这个配置是否生效。13、Spring Boot中的starter​ 首先这个 Starter 并非什么新的技术点基本上还是基于 Spring 已有功能来实现的。首先它提供了一个自动化配置类一般命名为 XXXAutoConfiguration 在这个配置类中通过条件注解来决定一个配置是否生效条件注解就是 Spring 中原本就有的然后它还会提供一系列的默认配置也允许开发者根据实际情况自定义相关配置然后通过类型安全的属性注入将这些配置属性注入进来新注入的属性会代替掉默认属性。正因为如此很多第三方框架我们只需要引入依赖就可以直接使用了。 当然开发者也可以自定义 Starter自定义 Starter 可以参考徒手撸一个 Spring Boot 中的 Starter 解密自动化配置黑魔法14、Spring Boot跨域问题​ 跨域可以在前端通过 JSONP 来解决但是 JSONP 只可以发送 GET 请求无法发送其他类型的请求在 RESTful 风格的应用中就显得非常鸡肋因此我们推荐在后端通过 CORSCross-origin resource sharing 来解决跨域问题。这种解决方案并非 Spring Boot 特有的在传统的 SSM 框架中就可以通过 CORS 来解决跨域问题只不过之前我们是在 XML 文件中配置 CORS 现在则是通过 CrossOrigin 注解来解决跨域问题。关于 CORS 小伙伴们可以参考Spring Boot 中通过 CORS 解决跨域问题15、Spring Boot定时任务​ 使用spring boot创建定时任务主要有以下三种创建方式​ 一、基于注解Scheduled​ 默认为单线程开启多个任务时任务的执行时机会受上一个任务执行时 间的影响。​ ① 创建定时器Configuration //1.主要用于标记配置类兼备Component的效果。 EnableScheduling // 2.开启定时任务 public class SaticScheduleTask {//3.添加定时任务Scheduled(cron 0/5 * * * * ?)//或直接指定时间间隔例如5秒//Scheduled(fixedRate5000)private void configureTasks() {System.err.println(执行静态定时任务时间: LocalDateTime.now());} }②启动测试​ 显然使用Scheduled 注解很方便但缺点是当我们调整了执行周期的时候需要重启应用才能生效这多少有些不方便。为了达到实时生效的效果可以使用接口来完成定时任务。​ 二、基于接口SchedulingConfigurer​ 1、导入依赖包parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.0.4.RELEASE/version/parentdependenciesdependency!--添加Web依赖 --groupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependency!--添加MySql依赖 --groupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependencydependency!--添加Mybatis依赖 配置mybatis的一些初始化的东西--groupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion1.3.1/version/dependencydependency!-- 添加mybatis依赖 --groupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.4.5/versionscopecompile/scope/dependency/dependencies​ 2、添加数据库记录开启本地数据库mysql随便打开查询窗口然后执行脚本内容代码如下DROP DATABASE IF EXISTS socks; CREATE DATABASE socks; USE SOCKS; DROP TABLE IF EXISTS cron; CREATE TABLE cron (cron_id varchar(30) NOT NULL PRIMARY KEY,cron varchar(30) NOT NULL ); INSERT INTO cron VALUES (1, 0/5 * * * * ?);然后在项目中的application.yml添加数据源spring:datasource:url: jdbc:mysql://localhost:3306/socksusername: rootpassword: 1234563、创建定时器​ 数据库准备好数据之后我们编写定时任务注意这里添加的是TriggerTask目的是循环读取我们在数据库设置好的执行周期以及执行相关定时任务的内容。具体代码如下Configuration //1.主要用于标记配置类兼备Component的效果。 EnableScheduling // 2.开启定时任务 public class DynamicScheduleTask implements SchedulingConfigurer {Mapperpublic interface CronMapper {Select(select cron from cron limit 1)public String getCron();}Autowired //注入mapperSuppressWarnings(all)CronMapper cronMapper;/*** 执行定时任务.*/Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(//1.添加任务内容(Runnable)() - System.out.println(执行动态定时任务: LocalDateTime.now().toLocalTime()),//2.设置执行周期(Trigger)triggerContext - {//2.1 从数据库获取执行周期String cron cronMapper.getCron();//2.2 合法性校验.if (StringUtils.isEmpty(cron)) {// Omitted Code ..}//2.3 返回执行周期(Date)return new CronTrigger(cron).nextExecutionTime(triggerContext);});}}4、启动测试启动应用后查看控制台打印时间是我们预期的每10秒一次然后打开Navicat 将执行周期修改为每6秒执行一次如图查看控制台发现执行周期已经改变并且不需要我们重启应用十分方便。如图注意 如果在数据库修改时格式出现错误则定时任务会停止即使重新修改正确此时只能重新启动项目才能恢复。三、基于注解设定多线程定时任务1、创建多线程定时任务//Component注解用于对那些比较中立的类进行注释 //相对与在持久层、业务层和控制层分别采用 Repository、Service 和 Controller 对分层中的类进行注释 Component EnableScheduling // 1.开启定时任务 EnableAsync // 2.开启多线程 public class MultithreadScheduleTask {AsyncScheduled(fixedDelay 1000) //间隔1秒public void first() throws InterruptedException {System.out.println(第一个定时任务开始 : LocalDateTime.now().toLocalTime() rn线程 : Thread.currentThread().getName());System.out.println();Thread.sleep(1000 * 10);}AsyncScheduled(fixedDelay 2000)public void second() {System.out.println(第二个定时任务开始 : LocalDateTime.now().toLocalTime() rn线程 : Thread.currentThread().getName());System.out.println();}}2、启动测试查看控制台从控制台可以看出第一个定时任务和第二个定时任务互不影响并且由于开启了多线程第一个任务的执行时间也不受其本身执行时间的限制所以需要注意可能会出现重复操作导致数据异常16、Spring Boot 全局异常处理1、基于ControllerAdvice注解的Controller层创建 MyControllerAdvice并添加 ControllerAdvice注解。package com.shsxt.demo.controller;import org.springframework.ui.Model; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map;/*** controller 增强器* author sam* since 2017/7/17*/ ControllerAdvice public class MyControllerAdvice {/*** 应用到所有RequestMapping注解方法在其执行之前初始化数据绑定器* param binder*/InitBinderpublic void initBinder(WebDataBinder binder) {}/*** 把值绑定到Model中使全局RequestMapping可以获取到该值* param model*/ModelAttributepublic void addAttributes(Model model) {model.addAttribute(author, Magical Sam);}/*** 全局异常捕捉处理* param ex* return*/ResponseBodyExceptionHandler(value Exception.class)public Map errorHandler(Exception ex) {Map map new HashMap();map.put(code, 100);map.put(msg, ex.getMessage());return map;}}启动应用后被 ExceptionHandler、InitBinder、ModelAttribute 注解的方法都会作用在 被 RequestMapping 注解的方法上。ModelAttribute在Model上设置的值对于所有被 RequestMapping 注解的方法中都可以通过 ModelMap 获取如下RequestMapping(/home) public String home(ModelMap modelMap) {System.out.println(modelMap.get(author)); }//或者 通过ModelAttribute获取RequestMapping(/home) public String home(ModelAttribute(author) String author) {System.out.println(author); }ExceptionHandler 拦截了异常我们可以通过该注解实现自定义异常处理。其中ExceptionHandler 配置的 value 指定需要拦截的异常类型上面拦截了 Exception.class 这种异常。2、基于Springboot自身的全局异常统一处理主要是实现ErrorController接口或者继承AbstractErrorController抽象类或者继承BasicErrorController类Controller层代码Controller RequestMapping(value error) EnableConfigurationProperties({ServerProperties.class}) public class ExceptionController implements ErrorController {private ErrorAttributes errorAttributes;Autowiredprivate ServerProperties serverProperties;/*** 初始化ExceptionController* param errorAttributes*/Autowiredpublic ExceptionController(ErrorAttributes errorAttributes) {Assert.notNull(errorAttributes, ErrorAttributes must not be null);this.errorAttributes errorAttributes;}/*** 定义404的ModelAndView* param request* param response* return*/RequestMapping(produces text/html,value 404)public ModelAndView errorHtml404(HttpServletRequest request,HttpServletResponse response) {response.setStatus(getStatus(request).value());MapString, Object model getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));return new ModelAndView(error/404, model);}/*** 定义404的JSON数据* param request* return*/RequestMapping(value 404)ResponseBodypublic ResponseEntityMapString, Object error404(HttpServletRequest request) {MapString, Object body getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));HttpStatus status getStatus(request);return new ResponseEntityMapString, Object(body, status);}/*** 定义500的ModelAndView* param request* param response* return*/RequestMapping(produces text/html,value 500)public ModelAndView errorHtml500(HttpServletRequest request,HttpServletResponse response) {response.setStatus(getStatus(request).value());MapString, Object model getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));return new ModelAndView(error/500, model);}/*** 定义500的错误JSON信息* param request* return*/RequestMapping(value 500)ResponseBodypublic ResponseEntityMapString, Object error500(HttpServletRequest request) {MapString, Object body getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));HttpStatus status getStatus(request);return new ResponseEntityMapString, Object(body, status);}/*** Determine if the stacktrace attribute should be included.* param request the source request* param produces the media type produced (or {code MediaType.ALL})* return if the stacktrace attribute should be included*/protected boolean isIncludeStackTrace(HttpServletRequest request,MediaType produces) {ErrorProperties.IncludeStacktrace include this.serverProperties.getError().getIncludeStacktrace();if (include ErrorProperties.IncludeStacktrace.ALWAYS) {return true;}if (include ErrorProperties.IncludeStacktrace.ON_TRACE_PARAM) {return getTraceParameter(request);}return false;}/*** 获取错误的信息* param request* param includeStackTrace* return*/private MapString, Object getErrorAttributes(HttpServletRequest request,boolean includeStackTrace) {RequestAttributes requestAttributes new ServletRequestAttributes(request);return this.errorAttributes.getErrorAttributes(requestAttributes,includeStackTrace);}/*** 是否包含trace* param request* return*/private boolean getTraceParameter(HttpServletRequest request) {String parameter request.getParameter(trace);if (parameter null) {return false;}return !false.equals(parameter.toLowerCase());}/*** 获取错误编码* param request* return*/private HttpStatus getStatus(HttpServletRequest request) {Integer statusCode (Integer) request.getAttribute(javax.servlet.error.status_code);if (statusCode null) {return HttpStatus.INTERNAL_SERVER_ERROR;}try {return HttpStatus.valueOf(statusCode);}catch (Exception ex) {return HttpStatus.INTERNAL_SERVER_ERROR;}}/*** 实现错误路径,暂时无用* see ExceptionMvcAutoConfiguration#containerCustomizer()* return*/Overridepublic String getErrorPath() {return ;}}3、基于AOP也可以实现异常的全局处理在执行切点中配置的路径中的方法有异常时可以被捕获到建议使用该方式选用AOP方式主要是因为AOP不只可以做全局异常统一处理还可以统一打印接口请求入参和返回结果日志打印接口访问性能日志处理sql注入攻击以及处理入参特殊字符等问题import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.util.concurrent.TimeUnit;/*** Author: smy* Description: 调用接口打印性能日志以及接口报错之后记录错误日志* Date: 2018/9/20* Time: 15:16*/ Component Aspect public class InterfaceRequestErrrorAndPerformanceLog {public static final Logger logger LoggerFactory.getLogger(InterfaceRequestErrrorAndPerformanceLog.class);Value(${dc.log.bad.value:3000})private int performanceBadValue;Resourceprivate RabbitMQService rabbitMQService;Resourceprivate InterfaceErrorService interfaceErrorService;Pointcut(execution(* test.test.test.test.test.controller.*.*.*(..)))public void pointCut(){}Around(pointCut())public APIResponse handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable{Stopwatch stopwatch Stopwatch.createStarted();APIResponse apiResponse;try {logger.info(执行Controller开始: pjp.getSignature() 参数 Lists.newArrayList(pjp.getArgs()).toString());//处理入参特殊字符和sql注入攻击checkRequestParam(pjp);//执行访问接口操作apiResponse (APIResponse) pjp.proceed(pjp.getArgs());try{logger.info(执行Controller结束: pjp.getSignature() 返回值 JSONObject.toJSONString(apiResponse));//此处将日志打印放入try-catch是因为项目中有些对象实体bean过于复杂导致序列化为json的时候报错但是此处报错并不影响主要功能使用只是返回结果日志没有打印所以catch中也不做抛出异常处理}catch (Exception ex){logger.error(pjp.getSignature() 接口记录返回结果失败原因为{},ex.getMessage());}Long consumeTime stopwatch.stop().elapsed(TimeUnit.MILLISECONDS);logger.info(耗时 consumeTime (毫秒).);//当接口请求时间大于3秒时标记为异常调用时间并记录入库if(consumeTime performanceBadValue){DcPerformanceEntity dcPerformanceEntity new DcPerformanceEntity();dcPerformanceEntity.setInterfaceName(pjp.getSignature().toString());dcPerformanceEntity.setRequestParam(Lists.newArrayList(pjp.getArgs()).toString());dcPerformanceEntity.setConsumeTime(consumeTime 毫秒);RabbitMQMessageTarget mqTarget RabbitMQMessageTarget.createFanoutTarget(ProjectConstants.DC_KEY_EXCHANGE_PERFORMANCE, new String[] { ProjectConstants.DC_KEY_QUEUE_PERFORMANCE});rabbitMQService.send(mqTarget, JSON.toJSONString(dcPerformanceEntity));}} catch (Exception throwable) {apiResponse handlerException(pjp, throwable);}return apiResponse;}/*** Author: smy* Description: 处理接口调用异常* Date: 15:13 2018/10/25*/private APIResponse handlerException(ProceedingJoinPoint pjp, Throwable e) {APIResponse apiResponse;if(e.getClass().isAssignableFrom(ProjectException.class) ){//ProjectException为自定义异常类项目中Controller层会把所有的异常都catch掉并手工封装成ProjectException抛出来这样做的目的是ProjectException会记录抛出异常接口的路径名称以及请求参数等等有助于错误排查ProjectException projectException (ProjectException)e;logger.error(捕获到ProjectException异常:,JSONObject.toJSONString(projectException.getDcErrorEntity()));RabbitMQMessageTarget mqTarget RabbitMQMessageTarget.createFanoutTarget(ProjectConstants.DC_KEY_EXCHANGE_INTERFACE_ERROR, new String[] { ProjectConstants.DC_KEY_QUEUE_INTERFACE_ERROR});rabbitMQService.send(mqTarget, JSON.toJSONString(dataCenterException.getDcErrorEntity()));apiResponse new APIResponse(APIResponse.FAIL,null,projectException.getDcErrorEntity().getErrorMessage());} else if (e instanceof RuntimeException) {logger.error(RuntimeException{方法 pjp.getSignature() 参数 pjp.getArgs() ,异常 e.getMessage() }, e);apiResponse new APIResponse(APIResponse.FAIL,null,e.getMessage());} else {logger.error(异常{方法 pjp.getSignature() 参数 pjp.getArgs() ,异常 e.getMessage() }, e);apiResponse new APIResponse(APIResponse.FAIL,null,e.getMessage());}return apiResponse;}/*** Author: gmy* Description: 处理入参特殊字符和sql注入攻击* Date: 15:37 2018/10/25*/private void checkRequestParam(ProceedingJoinPoint pjp){String str String.valueOf(pjp.getArgs());if (!IllegalStrFilterUtil.sqlStrFilter(str)) {logger.info(访问接口 pjp.getSignature() 输入参数存在SQL注入风险参数为 Lists.newArrayList(pjp.getArgs()).toString());DcErrorEntity dcErrorEntity interfaceErrorService.processDcErrorEntity(pjp.getSignature() ,Lists.newArrayList(pjp.getArgs()).toString(),输入参数存在SQL注入风险!);throw new DataCenterException(dcErrorEntity);}if (!IllegalStrFilterUtil.isIllegalStr(str)) {logger.info(访问接口 pjp.getSignature() ,输入参数含有非法字符!参数为 Lists.newArrayList(pjp.getArgs()).toString());DcErrorEntity dcErrorEntity interfaceErrorService.processDcErrorEntity(pjp.getSignature() ,Lists.newArrayList(pjp.getArgs()).toString(),输入参数含有非法字符!);throw new DataCenterException(dcErrorEntity);}}}IllegalStrFilterUtil代码import org.slf4j.LoggerFactory;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** Author: gmy* Description: 特殊字符检测工具防止传入非法字符和sql注入攻击* Date: 2018/10/25* Time: 15:08*/ public class IllegalStrFilterUtil {private static final org.slf4j.Logger Logger LoggerFactory.getLogger(IllegalStrFilterUtil.class);private static final String REGX !|||◎|#||($)||%||(^)|……|()|※|(*)|×|(()||())||_|——|()||(|)|§ ;/*** 对常见的sql注入攻击进行拦截** param sInput* return* true 表示参数不存在SQL注入风险* false 表示参数存在SQL注入风险*/public static Boolean sqlStrFilter(String sInput) {if (sInput null || sInput.trim().length() 0) {return false;}sInput sInput.toUpperCase();if (sInput.indexOf(DELETE) 0 || sInput.indexOf(ASCII) 0 || sInput.indexOf(UPDATE) 0 || sInput.indexOf(SELECT) 0|| sInput.indexOf() 0 || sInput.indexOf(SUBSTR() 0 || sInput.indexOf(COUNT() 0 || sInput.indexOf( OR ) 0|| sInput.indexOf( AND ) 0 || sInput.indexOf(DROP) 0 || sInput.indexOf(EXECUTE) 0 || sInput.indexOf(EXEC) 0|| sInput.indexOf(TRUNCATE) 0 || sInput.indexOf(INTO) 0 || sInput.indexOf(DECLARE) 0 || sInput.indexOf(MASTER) 0) {Logger.error(该参数怎么SQL注入风险sInput sInput);return false;}Logger.info(通过sql检测);return true;}/*** 对非法字符进行检测** param sInput* return* true 表示参数不包含非法字符* false 表示参数包含非法字符*/public static Boolean isIllegalStr(String sInput) {if (sInput null || sInput.trim().length() 0) {return false;}sInput sInput.trim();Pattern compile Pattern.compile(REGX, Pattern.CASE_INSENSITIVE);Matcher matcher compile.matcher(sInput);Logger.info(通过字符串检测);return matcher.find();} }17、spring-boot-starter-parent 的作用定义了 Java 编译版本为 1.8 。使用 UTF-8 格式编码。继承自 spring-boot-dependencies这个里边定义了依赖的版本也正是因为继承了这个依赖所以我们在写依赖时才不需要写版本号。执行打包操作的配置。自动化的资源过滤。自动化的插件配置。针对 application.properties 和 application.yml 的资源过滤包括通过 profile 定义的不同环境的配置文件例如 application-dev.properties 和 application-dev.yml。
http://www.zqtcl.cn/news/801041/

相关文章:

  • 新网站建设特色网站建设信息表
  • 商城做网站家具网站模板
  • 国有企业网站建设网站悬浮qq
  • 上海建站宝盒微网站生成app
  • 做网站是什么时候分页有哪些制作网站的公司
  • 专业柳州网站建设哪家好5千ip的网站能赚多少钱
  • 网站开发代理最火网页游戏
  • 做网站运营工资多少网站建设协议需要注意的问题
  • 如何建设一个人工智能网站qq头像网站源码
  • 有什么网站可以做外贸出口信息泉州网站制作运营商专业
  • 创业seo快速排名优化公司
  • 安丘网站开发王野天 女演员
  • 沈阳软件公司 网站制作wordpress未验证邮箱用户
  • 做动画上传网站赚钱么杭州市网站建设公司
  • 网站建设注意细节问题微信二维码
  • 凡科做的网站提示证书错误网络营销渠道可分为哪几种
  • 南京手机网站制作公司免费设计房屋效果图软件有哪些
  • 定制类网站怎么样做网页设计
  • 企业门户网站建设优势网站登录模版
  • 六盘水建设网站徐州建站平台
  • 昆明有多少做网站的公司公司软文代写
  • 东莞模板网站做一个电子商务网站在哪里做
  • 给别人网站做跳转株洲专业网站排名优化
  • 国外网站空间租用费用网站前端设计图
  • 宜州做网站点点网 xml转wordpress
  • 太原建站方法erp系统好上手吗
  • 网站建设如何实现检索功能河南城乡建设网站
  • 江苏做电缆桥架的公司网站购物网站答辩ppt怎么做
  • 惠州网站建设系统公司公司网站建设公司
  • 做酒类直供网站行吗石家庄桥西网站制作公司