关于定时器setInterval(code, millisecond)和延时器setTimeout(code, millisecond)中第一个参数引号问题思考
对于自定义函数使用双引号必须加上括号;
setInterval("start()", 1000);
setTimeout("start()", 1000);
2025年06月19日
关于定时器setInterval(code, millisecond)和延时器setTimeout(code, millisecond)中第一个参数引号问题思考
对于自定义函数使用双引号必须加上括号;
setInterval("start()", 1000);
setTimeout("start()", 1000);
2025年06月19日
package com.alatus.secrurity.config;
import com.alatus.secrurity.Handler.MyAuthenticationFailureHandler;
import com.alatus.secrurity.Handler.MyAuthenticationSuccessHandler;
import com.alatus.secrurity.Handler.MyLogoutSuccessHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
//开启Spring Security的自定义配置
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated());
http.formLogin(formLogin->{
formLogin.loginPage("/login").permitAll()
// 修改自定义的表单参数
.usernameParameter("myUsername")
.passwordParameter("myPassword")
.failureUrl("/login?failure")
.failureHandler(new MyAuthenticationFailureHandler())
// 这里将默认的登录成功handler改为我们自定义的handler
.successHandler(new MyAuthenticationSuccessHandler());
//如果不配置permitAll,就会导致出现login页是初始登录页,但是这个页面资源又收到保护,导致跳转回登录页
//但是登录页又收到保护,于是又要跳转到登录页,就会形成页面递归导致报错
});
http.logout((Logout)->{
Logout.logoutSuccessHandler(new MyLogoutSuccessHandler());
});
http.csrf(csrf->csrf.disable());
return http.build();
}
// @Bean
// public UserDetailsService userDetailsService() {
//// 创建基于内存的用户信息管理器
//// InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//// 创建基于数据库的用户信息管理器
// DBUserDetailsManager manager = new DBUserDetailsManager();
//// 创建UserDetails对象,并设置用户名、密码、角色权限等内容
//// 因为用户都在数据库创建保存和查询,所以这里我们使用数据库中的用户信息进行登录验证
//// manager.createUser(User.withDefaultPasswordEncoder().username("admin").password("admin").roles("USER").build());
//// 这里我们的manager对象用于管理我们创建的用户信息
// return manager;
// }
}
2025年06月19日
前面介绍了在项目开发时为什么选择Spring Security,还介绍了它的原理。本节开始动手实践Spring Security的相关技术。
2025年06月19日
Spring Security提供了身份认证,权限认证,防御常见攻击三个功能
保护应用程序URL,要求对应用程序的任何交付都必须进行身份验证
2025年06月19日
它通过一系列的过滤链,层层Filter走下来,最终走到Servlet
正常情况下,这些Filter都需要被注册在我们的Servlet才能够生效
但是为了更灵活的使用,这些Filter将被我们以Bean的形式管理
2025年06月19日
Principal是用户身份信息,Credentials是用户凭证信息(密码),Auth是用户权限
package com.alatus.secrurity.config;
import com.alatus.secrurity.Handler.MyAuthenticationEntryPoint;
import com.alatus.secrurity.Handler.MyAuthenticationFailureHandler;
import com.alatus.secrurity.Handler.MyAuthenticationSuccessHandler;
import com.alatus.secrurity.Handler.MyLogoutSuccessHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
//开启Spring Security的自定义配置
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated());
http.formLogin(formLogin->{
formLogin.loginPage("/login").permitAll()
// 修改自定义的表单参数
.usernameParameter("myUsername")
.passwordParameter("myPassword")
.failureUrl("/login?failure")
.failureHandler(new MyAuthenticationFailureHandler())
// 这里将默认的登录成功handler改为我们自定义的handler
.successHandler(new MyAuthenticationSuccessHandler());
//如果不配置permitAll,就会导致出现login页是初始登录页,但是这个页面资源又收到保护,导致跳转回登录页
//但是登录页又收到保护,于是又要跳转到登录页,就会形成页面递归导致报错
});
http.logout((Logout)->{
Logout.logoutSuccessHandler(new MyLogoutSuccessHandler());
});
http.exceptionHandling(exceptionHandling->{
exceptionHandling.authenticationEntryPoint(new MyAuthenticationEntryPoint());
});
http.csrf(csrf->csrf.disable());
http.cors(withDefaults());
return http.build();
}
// @Bean
// public UserDetailsService userDetailsService() {
//// 创建基于内存的用户信息管理器
//// InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//// 创建基于数据库的用户信息管理器
// DBUserDetailsManager manager = new DBUserDetailsManager();
//// 创建UserDetails对象,并设置用户名、密码、角色权限等内容
//// 因为用户都在数据库创建保存和查询,所以这里我们使用数据库中的用户信息进行登录验证
//// manager.createUser(User.withDefaultPasswordEncoder().username("admin").password("admin").roles("USER").build());
//// 这里我们的manager对象用于管理我们创建的用户信息
// return manager;
// }
}
2025年06月19日
模板引擎是为了使用户界面与业务数据分离而产生的,它具有丰富的功能,可以生成特定格式的页面,在Web开发中的模板引擎最后会生成一个标准的HTML文档。模板引擎的解析过程如图4.1所示,其把数据和静态模板相互匹配后,数据会替换其中的变量,最后形成HTML页面展示给用户。
2025年06月19日
package com.alatus.secrurity.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
//开启Spring Security的自定义配置
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated())
.formLogin(formLogin->{
formLogin.loginPage("/login").permitAll();
//如果不配置permitAll,就会导致出现login页是初始登录页,但是这个页面资源又收到保护,导致跳转回登录页
//但是登录页又收到保护,于是又要跳转到登录页,就会形成页面递归导致报错
})
.httpBasic(withDefaults())
.logout((logout) -> logout.permitAll());
http.csrf(csrf->csrf.disable());
return http.build();
}
// @Bean
// public UserDetailsService userDetailsService() {
//// 创建基于内存的用户信息管理器
//// InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//// 创建基于数据库的用户信息管理器
// DBUserDetailsManager manager = new DBUserDetailsManager();
//// 创建UserDetails对象,并设置用户名、密码、角色权限等内容
//// 因为用户都在数据库创建保存和查询,所以这里我们使用数据库中的用户信息进行登录验证
//// manager.createUser(User.withDefaultPasswordEncoder().username("admin").password("admin").roles("USER").build());
//// 这里我们的manager对象用于管理我们创建的用户信息
// return manager;
// }
}
2025年06月19日
在电商行业快速发展的今天,电商 API 接口已经成为商家运营中不可或缺的技术工具。无论是提升运营效率、优化用户体验,还是拓展业务渠道,电商 API 接口都发挥着重要作用。然而,许多电商新手可能对 API 接口还知之甚少。本文将带你深入了解电商 API 接口,帮助你更好地利用这一强大工具,提升电商业务的竞争力。
一、什么是电商 API 接口?
API(Application Programming Interface,应用程序编程接口)是一种允许不同软件系统之间进行交互的协议和工具。简单来说,API 接口就像是一个“桥梁”,让不同的应用程序能够共享数据和功能。