springboot-base

Springboot 基础教育

最近看见恒宇少年出了新的技术框架,想起之前我还学习过他的Springboot的教程,原先有些心得感受重新编写一遍。

一、FastJson的使用

FastJson是阿里出的json处理库,在java开发与前端调试的接口基本上是使用json的方式,所以如果有个工具能够帮助解决json字符串转换的话是有非常迫切的需求,尤其是json转化为实体对象以及数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static final Object parse(String text);// 把JSON文本parse 为JSONObject或者JSONArray

public static final JSONObject parseObject(String text);// 把JSON文本parse成JSONObject

public static final <T> T parseObject(String text,Class<T> clazz);// 把JSON 文本parse为JavaBean

public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray

public static final <T> List<T> parseArray(String text, Class<T> clazz); // 把JSON文本parse为JavaBean集合

public static final String toJSONString(Object object); // 把JavaBean序列化为JSON文本

public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本

fastjson 还有比较常用的就是对实体类的注解了 @JSONField

1
2
3
4
5
@JSONField(name="Date",format="dd/MM/yyyy",ordinal=3)
private Date dateOfBirth;
// format 用于格式化
// ordinal 用于指定字段顺序
// serialize 一般是数字指定字段序列化

二、拦截器的使用

1、创建一个拦截器,让他集成HandlerIntercepter

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
public class SessionInterceptor implements HandlerInterceptor
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
System.out.println(request.getRequestURI());
//登录不做拦截
if(request.getRequestURI().equals("/user/login") || request.getRequestURI().equals("/user/login_view")){
return true;
}
//验证session是否存在
Object obj = request.getSession().getAttribute("_session_user");
if(obj == null){
response.sendRedirect("/user/login_view");
return false;
}
return true;
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}

2、把拦截器配置到Springboot的配置当中

1
2
3
4
5
6
7
@Configuration
public class SessionConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**");
}
}

3、尝试使用日志的例子来做拦截器,日志管理有默认的一些框架,如Springboot默认是Logback,但是有的时候我更希望能有界面进行日志查询,那么我就会做一个实力类来做这块的记录,然后拦截器做好日志拦截

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
@Entity
@Table(name = "t_logger_infos")
@Data
public class LoggerEntity implements Serializable
{
//编号
@Id
@GeneratedValue
@Column(name = "ali_id")
private Long id;
//客户端请求ip
@Column(name = "ali_client_ip")
private String clientIp;
//客户端请求路径
@Column(name = "ali_uri")
private String uri;
//终端请求方式,普通请求,ajax请求
@Column(name = "ali_type")
private String type;
//请求方式method,post,get等
@Column(name = "ali_method")
private String method;
//请求参数内容,json
@Column(name = "ali_param_data")
private String paramData;
//请求接口唯一session标识
@Column(name = "ali_session_id")
private String sessionId;
//请求时间
@Column(name = "ali_time",insertable = false)
private Timestamp time;
//接口返回时间
@Column(name = "ali_returm_time")
private String returnTime;
//接口返回数据json
@Column(name = "ali_return_data")
private String returnData;
//请求时httpStatusCode代码,如:200,400,404等
@Column(name = "ali_http_status_code")
private String httpStatusCode;
//请求耗时秒单位
@Column(name = "ali_time_consuming")
private int timeConsuming;

JPA 就不说了,这里重点说明一下拦截器,仿拦截器的方式

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// 写一个获取Spring上下文管理的Bean工具


public class LoggerInterceptor implements HandlerInterceptor
{
//请求开始时间标识
private static final String LOGGER_SEND_TIME = "_send_time";
//请求日志实体标识
private static final String LOGGER_ENTITY = "_logger_entity";

/**
* 进入SpringMVC的Controller之前开始记录日志实体
* @param request 请求对象
* @param response 响应对象
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
//创建日志实体
LoggerEntity logger = new LoggerEntity();
//获取请求sessionId
String sessionId = request.getRequestedSessionId();
//请求路径
String url = request.getRequestURI();
//获取请求参数信息
String paramData = JSON.toJSONString(request.getParameterMap(),
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteMapNullValue);
//设置客户端ip
logger.setClientIp(LoggerUtils.getCliectIp(request));
//设置请求方法
logger.setMethod(request.getMethod());
//设置请求类型(json|普通请求)
logger.setType(LoggerUtils.getRequestType(request));
//设置请求参数内容json字符串
logger.setParamData(paramData);
//设置请求地址
logger.setUri(url);
//设置sessionId
logger.setSessionId(sessionId);
//设置请求开始时间
request.setAttribute(LOGGER_SEND_TIME,System.currentTimeMillis());
//设置请求实体到request内,方面afterCompletion方法调用
request.setAttribute(LOGGER_ENTITY,logger);
return true;
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
//获取请求错误码
int status = response.getStatus();
//当前时间
long currentTime = System.currentTimeMillis();
//请求开始时间
long time = Long.valueOf(request.getAttribute(LOGGER_SEND_TIME).toString());
//获取本次请求日志实体
LoggerEntity loggerEntity = (LoggerEntity) request.getAttribute(LOGGER_ENTITY);
//设置请求时间差
loggerEntity.setTimeConsuming(Integer.valueOf((currentTime - time)+""));
//设置返回时间
loggerEntity.setReturnTime(currentTime + "");
//设置返回错误码
loggerEntity.setHttpStatusCode(status+"");
//设置返回值
loggerEntity.setReturnData(JSON.toJSONString(request.getAttribute(LoggerUtils.LOGGER_RETURN),
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteMapNullValue));
//执行将日志写入数据库
LoggerJPA loggerDAO = getDAO(LoggerJPA.class,request);
loggerDAO.save(loggerEntity);
}

private <T> T getDao(Class<T> clazz,HttpServletRequest request){
BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
return factory.getBean(clazz);
}