导入依赖
在处理请求参数时需要用到Json,其他依赖请查看源码
<!-- Json解析 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
部分配置文件
spring:
datasource:
url: jdbc
:mysql
://localhost
:3306/log
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update
创建实体类
@Entity
@Data
@Table(name
= "zj_syslog")
public class SysLog implements Serializable {
@Id
@GeneratedValue(strategy
= GenerationType
.IDENTITY
)
private Long id
;
private String username
;
private String url
;
private Integer time
;
private String method
;
private String params
;
private String ip
;
private String location
;
@CreationTimestamp
private Timestamp createTime
;
}
创建 repository
@Repository
public interface SysLogRepo extends JpaRepository<SysLog,Long>{
}
自定义日志拦截器
public class LogInterceptor implements HandlerInterceptor {
private static final String LOGGER_SEND_TIME
= "_send_time";
private static final String LOGGER_ENTITY
= "_logger_entity";
@Override
public boolean preHandle(HttpServletRequest request
, HttpServletResponse response
, Object o
) throws Exception
{
SysLog sysLog
= new SysLog();
String param
= JSON
.toJSONString(request
.getParameterMap(),
SerializerFeature
.DisableCircularReferenceDetect
,
SerializerFeature
.WriteMapNullValue
);
sysLog
.setParams(param
);
sysLog
.setIp(AddressUtils
.getIpAddr(request
));
sysLog
.setLocation(AddressUtils
.getCityInfo(sysLog
.getIp()));
sysLog
.setMethod(request
.getMethod());
sysLog
.setUrl(request
.getRequestURI());
request
.setAttribute(LOGGER_SEND_TIME
,System
.currentTimeMillis());
request
.setAttribute(LOGGER_ENTITY
,sysLog
);
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest
, HttpServletResponse httpServletResponse
, Object o
, ModelAndView modelAndView
) throws Exception
{
int status
= httpServletResponse
.getStatus();
if(status
==404){
modelAndView
.setViewName("/404");
}
}
@Override
public void afterCompletion(HttpServletRequest request
, HttpServletResponse response
, Object o
, Exception e
) throws Exception
{
SysLogRepo sysLogRepo
= SpringContextUtils
.getBean("sysLogRepo",SysLogRepo
.class);
int status
= response
.getStatus();
long currentTime
= System
.currentTimeMillis();
long time
= Long
.valueOf(request
.getAttribute(LOGGER_SEND_TIME
).toString());
SysLog sysLog
= (SysLog
) request
.getAttribute(LOGGER_ENTITY
);
sysLog
.setUsername("admin");
sysLog
.setTime(Integer
.valueOf((currentTime
- time
)+""));
if(!sysLog
.getMethod().equals("GET")){
}
sysLogRepo
.save(sysLog
);
}
}
新增ConfigurerAdapter
新增ConfigurerAdapter类,实现WebMvcConfigurer接口
重写addInterceptors方法,添加我们的拦截器
@Configuration
public class ConfigurerAdapter implements WebMvcConfigurer {
private final String
[] excludePath
= {"/list"};
@Override
public void addInterceptors(InterceptorRegistry registry
) {
registry
.addInterceptor(new LogInterceptor()).addPathPatterns("/**").excludePathPatterns(excludePath
);
}
}
项目结构如下
测试
编写TestController
@RestController
public class TestController {
@Autowired
private SysLogRepo sysLogRepo
;
@GetMapping(value
= "/test")
public String
test1(String test
){
return test
;
}
@GetMapping(value
= "/list")
public ModelAndView
list(Model model
){
List
<SysLog> sysLogs
= sysLogRepo
.findAll();
model
.addAttribute("sysLogs",sysLogs
);
return new ModelAndView("/index");
}
}
依次访问:
localhost:8080/test?test=123
localhost:8080/list