let arr = [1,2,3,4,5]
上面数组的值,想要快速的计算出总和怎么计算呢?
用for循环来做确实能达到目的,但是不是一个聪明的做法。
javascript提供了reduce()方法
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

function getSum(total, num) {
    return total + num;
}
function myFunction(item) {
   console.log(arr.reduce(getSum))
}

计算结果依次为1+2=3 3+3=6 6+4=10 10+5=15

我们在下载文件的时候,后端同学给我们的一般是二进制的文件。
如果按照普通的请求方式处理,前端也没办法直接下载。
首先,下载获取到二进制流了以后,应该把二进制流转换成Blob类型,然后IE浏览器使用模拟点击的方式去下载,非IE浏览器可以使用navigator浏览器对象的方法来下载文件



- 阅读剩余部分 -

spring security

Spring security 是一个强大的和高度可定制的身份验证和访问控制框架。它是确保基于Spring的应用程序的标准。更多请预览官方文档:https://spring.io/projects/spring-security 中文版文档:https://www.springcloud.cc/spring-security-zhcn.html
一、核心功能
认证
授权
攻击防护

二、原理

(一)整个框架的核心是一个过滤器,这个过滤器名字叫springSecurityFilterChain类型是FilterChainProxy
(二)核心过滤器里面是过滤器链(列表),过滤器链的每个元素都是一组URL对应一组过滤器
(三)WebSecurity用来创建FilterChainProxy过滤器,HttpSecurity用来创建过滤器链的每个元素。

引用 持盾的紫眸的【深入浅出Spring Security(一):三句话解释框架原理】

三、使用

特殊说明:以下内容是以本人项目需求为标准配置的spring security,也是基于spring boot框架的。

(一)引入依赖(pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

(二)配置

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
     @Autowired
     private UserDetailsService userDetailsService;
     @Autowired
     private PasswordEncoder passwordEncoder;
     @Override
     protected void configure(HttpSecurity http) throws Exception {
     http.csrf().disable();
     // 基于token,所以不需要session
     http.sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .formLogin()//表单登录
            .usernameParameter("mobile")
            .passwordParameter("password")
            .loginProcessingUrl("/formLogin")
            .permitAll()
            .successHandler(authenticationSuccessHandler)//登陆成功的处理
            .failureHandler(authenticationFailureHandler)//登陆失败的处理
            .and()
            .authorizeRequests()
            .antMatchers(
                    "/v2/**",//swagger相关工具页面
                    "/swagger-resources/**",//swagger相关工具页面
                    "/swagger-ui.html/**"//swagger相关工具页面
            )//白名单,不验证,不授权,不防护
            .permitAll()//permitALL()表示放开和登陆有关的接口
            .anyRequest().authenticated()//除白名单外都需要验证才可访问
            .and()
            .csrf()
            .disable()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessHandler(logoutSuccessHandler)
            .permitAll(false)
            .and()
            .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
    ;// 自定义的过滤器顺序为:ipFilter -> logFilter -> jwtClientTypeFilter -> tokenFilter -> sendSmsFilter
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
}

1、

swagger ui

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。

一、作用

(一)接口的文档在线自动生成。
(二)功能测试。

二、主要项目

(一)Swagger-tools:提供各种与Swagger进行集成和交互的工具。例如模式检验、Swagger 1.2文档转换成Swagger 2.0文档等功能。
(二)Swagger-core: 用于Java/Scala的的Swagger实现。与JAX-RS(Jersey、Resteasy、CXF...)、Servlets和Play框架进行集成。
(三)Swagger-js: 用于JavaScript的Swagger实现。
(四)Swagger-node-express: Swagger模块,用于node.js的Express web应用框架。
(五)Swagger-ui:一个无依赖的HTML、JS和CSS集合,可以为Swagger兼容API动态生成优雅文档。
(六)Swagger-codegen:一个模板驱动引擎,通过分析用户Swagger资源声明以各种语言生成客户端代码。

三、maven

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>1.0(版本自行选择)</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>1.0(版本自行选择)</version>
</dependency>

四、使用(spring boot)
(一)配置

swagger:
enable: true

(二)创建SwaggerAppConfig

@EnableSwagger2
@Configuration
public class SwaggerAppConfig {
    @Value("${swagger.enable}")
    private boolean enableSwagger;
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("接口文档")
            .description("服务调试接口")
            .contact(ApiInfo.DEFAULT_CONTACT)
            .version("1.0.1")
            .build();
    }
   @Bean
   public Docket commonWechat() {
       Docket docket = new Docket(DocumentationType.SWAGGER_2);
       docket.enable(enableSwagger)
            .groupName("测试相关API")
            .apiInfo(apiInfo())
            .select()
            .paths(PathSelectors.regex("/common/.*"))
            .build();
      return docket;
   }

}

(二)接口文件注入@Api(description = "基础服务API")

@Api(description = "基础服务API")
@RestController
@RequestMapping("/common")
public class CommonController extends BaseController {

}