Marvin's Blog

Hi, My friend. Welcome to my space

0%

Java Compound

Http Cros(跨域请求)
  • Get请求
1
2
3
4
5
6
7
8
$.ajax({
url: "http://192.168.1.240:8000/test/hello",
dataType: "jsonp",//必要
jsonp: 'callbacks',//非必要
success: function (data) {
console.log(data);
}
})
  • 非Get请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
@CrossOrigin//类级别配置跨域,允许所有端口以及所有方式
public class TestCtrl {
//...

@GetMapping("/hello")
public String hello(HttpServletResponse response) {
//方法级别设置跨域
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
return (new Date()) + "Hello , Here is the api space .";
}
}

//以上两种方式不切实际,推荐使用以下两种方式

//CORS全局配置跨域请求
@Configuration
public class CorsConfig implements WebMvcConfigurer {

@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
//允许跨域的域名,可以用*表示允许任何域名使用
.allowedOrigins("http://192.168.1.240", "http://192.168.1.241")
//允许任何方法(post、get等)
.allowedMethods("POST", "PUT", "GET")
//允许任何请求头
.allowedHeaders("*")
//带上cookie信息
.allowCredentials(true)
//maxAge(3600)表明在3600秒内,不需要再发送预检验请求,可以缓存该结果
.exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(3600L);
}
};
}

}

//拦截器实现跨域配置
@Component
public class CorsFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Credentials", "true");
res.addHeader("Access-Control-Allow-Origin", "*");
res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
response.getWriter().println("ok");
return;
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
MySQL 5.7 解压版本安装
1
2
basedir ="D:\mysql"
datadir ="D:\mysql\data"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#my.ini配置文件可有可无
mysqld -install MySQL --defaults-file="D:\mysql\my.ini"
mysqld --initialize --user=mysql --console
#以下内容为初始化成功结束时控制台内容,需要记下最后的初始密码
#...
#2020-10-23T01:04:10.139593Z 0 [Warning] CA certificate ca.pem is self signed.
#2020-10-23T01:04:10.327391Z 1 [Note] A temporary password is generated for root@localhost: N2DwygNme,fi
#...
#启动服务
net start mysql
#登陆服务器
mysql -uroot -p
#初始密码:N2DwygNme,fi
#修改密码(必须)
ALTER USER 'root'@'localhost' IDENTIFIED BY '自定义密码';
Spring 依赖注入

实现方式有三种:

  • 成员变量注入

    1
    2
    @Autowired
    private IGyUserService userService;

    优点:代码简洁 缺点:NullPointerException

  • 构造器注入

    1
    2
    3
    4
    5
    private final IGyUserService userService;

    public CustomUserDetailsService(IGyUserService userService) {
    this.userService = userService;
    }

    必须强制注入,通过强制指明依赖注入来保证这个类的运行。

  • set方法注入

    1
    2
    3
    4
    5
    6
    private UserDao userDao;

    @Autowired
    public void setUserDao (UserDao userDao) {
    this.userDao = userDao;
    }

    这是一种选择注入,可有可无,即使没有注入这个依赖,那么也不会影响整个类的运行。

理解:
依赖注入的核心思想之一就是被容器管理的类不应该依赖被容器管理的依赖,换成白话来说就是如果这个类使用了依赖注入的类,那么这个类摆脱了这几个依赖必须也能正常运行。然而使用变量注入的方式是不能保证这点的。
既然使用了依赖注入方式,那么就表明这个类不再对这些依赖负责,这些都由容器管理,那么如何清楚的知道这个类需要哪些依赖呢?它就要使用set方法方式注入或者构造器注入。

总结
变量方式注入应该尽量避免,使用set方式注入或者构造器注入,这两种方式的选择就要看这个类是强制依赖的话就用构造器方式,选择依赖的话就用set方法注入。