Skip to content

Commit 5d2f307

Browse files
刘少明/系统开发一室/数据服务部/总公司刘少明/系统开发一室/数据服务部/总公司
authored andcommitted
flylib-boot-start更新 。 增加Filter和Interceptor的代码配置(不用配置文件,直接在代码里设置)
1 parent 874c92c commit 5d2f307

File tree

6 files changed

+253
-40
lines changed

6 files changed

+253
-40
lines changed

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@ flylib-boot是针对springboot构建的程序的基础框架,专门用于构
33
异常处理
44

55
## 功能
6-
1. 全局的异常处理
7-
2. 其它
6+
包含一个Spring Boot的一些常见的基础组件的设置
7+
1. 针对Handler的全局的异常处理(处理所有Controller里的Handler里抛出的异常)
8+
2. Filter
9+
3. Interceptor
10+
11+
注意:SpringBoot(SpringMVC)里的Handler特指@Controller注解的类里的每个处理HTTP请求的一个public method.
812

913
## 使用方法
1014
在自己的项目中添加flylib-boot-starter的maven依赖

flylib-boot-demo/flylib-boot-demo.iml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
<content url="file://$MODULE_DIR$">
77
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
88
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
9-
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
109
<excludeFolder url="file://$MODULE_DIR$/target" />
1110
</content>
1211
<orderEntry type="inheritedJdk" />

flylib-boot-starter/flylib-boot-starter.iml

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,46 @@
55
<output-test url="file://$MODULE_DIR$/target/test-classes" />
66
<content url="file://$MODULE_DIR$">
77
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
8-
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
9-
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
108
<excludeFolder url="file://$MODULE_DIR$/target" />
119
</content>
1210
<orderEntry type="inheritedJdk" />
1311
<orderEntry type="sourceFolder" forTests="false" />
14-
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:1.5.8.RELEASE" level="project" />
15-
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:1.5.8.RELEASE" level="project" />
16-
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:1.5.8.RELEASE" level="project" />
17-
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:1.5.8.RELEASE" level="project" />
18-
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:1.5.8.RELEASE" level="project" />
19-
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.1.11" level="project" />
20-
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.1.11" level="project" />
21-
<orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.25" level="project" />
22-
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
23-
<orderEntry type="library" name="Maven: org.slf4j:log4j-over-slf4j:1.7.25" level="project" />
24-
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.17" level="project" />
25-
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:1.5.8.RELEASE" level="project" />
26-
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.23" level="project" />
27-
<orderEntry type="library" name="Maven: org.apache.tomcat:tomcat-annotations-api:8.5.23" level="project" />
28-
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.23" level="project" />
29-
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.23" level="project" />
30-
<orderEntry type="library" name="Maven: org.hibernate:hibernate-validator:5.3.5.Final" level="project" />
31-
<orderEntry type="library" name="Maven: javax.validation:validation-api:1.1.0.Final" level="project" />
32-
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.1.Final" level="project" />
33-
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
34-
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.10" level="project" />
35-
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.0" level="project" />
36-
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.8.10" level="project" />
37-
<orderEntry type="library" name="Maven: org.springframework:spring-web:4.3.12.RELEASE" level="project" />
38-
<orderEntry type="library" name="Maven: org.springframework:spring-aop:4.3.12.RELEASE" level="project" />
39-
<orderEntry type="library" name="Maven: org.springframework:spring-beans:4.3.12.RELEASE" level="project" />
40-
<orderEntry type="library" name="Maven: org.springframework:spring-context:4.3.12.RELEASE" level="project" />
41-
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:4.3.12.RELEASE" level="project" />
42-
<orderEntry type="library" name="Maven: org.springframework:spring-expression:4.3.12.RELEASE" level="project" />
43-
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:1.5.8.RELEASE" level="project" />
44-
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:1.5.8.RELEASE" level="project" />
45-
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:1.5.8.RELEASE" level="project" />
12+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework.boot:spring-boot-starter-web:1.5.0.RELEASE" level="project" />
13+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework.boot:spring-boot-starter:1.5.0.RELEASE" level="project" />
14+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework.boot:spring-boot:1.5.0.RELEASE" level="project" />
15+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework.boot:spring-boot-autoconfigure:1.5.0.RELEASE" level="project" />
16+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework.boot:spring-boot-starter-logging:1.5.0.RELEASE" level="project" />
17+
<orderEntry type="library" scope="PROVIDED" name="Maven: ch.qos.logback:logback-classic:1.1.9" level="project" />
18+
<orderEntry type="library" scope="PROVIDED" name="Maven: ch.qos.logback:logback-core:1.1.9" level="project" />
19+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:jcl-over-slf4j:1.7.22" level="project" />
20+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:jul-to-slf4j:1.7.22" level="project" />
21+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:log4j-over-slf4j:1.7.22" level="project" />
22+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.17" level="project" />
23+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:1.5.0.RELEASE" level="project" />
24+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.11" level="project" />
25+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.11" level="project" />
26+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.11" level="project" />
27+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.hibernate:hibernate-validator:5.3.4.Final" level="project" />
28+
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.validation:validation-api:1.1.0.Final" level="project" />
29+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.logging:jboss-logging:3.3.0.Final" level="project" />
30+
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml:classmate:1.3.3" level="project" />
31+
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.6" level="project" />
32+
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.0" level="project" />
33+
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-core:2.8.6" level="project" />
34+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-web:4.3.6.RELEASE" level="project" />
35+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-aop:4.3.6.RELEASE" level="project" />
36+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-beans:4.3.6.RELEASE" level="project" />
37+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-context:4.3.6.RELEASE" level="project" />
38+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-webmvc:4.3.6.RELEASE" level="project" />
39+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-expression:4.3.6.RELEASE" level="project" />
40+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:1.5.0.RELEASE" level="project" />
41+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:1.5.0.RELEASE" level="project" />
42+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:1.5.0.RELEASE" level="project" />
4643
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.2.0" level="project" />
4744
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.2.1" level="project" />
4845
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.1" level="project" />
4946
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.3" level="project" />
50-
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
47+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-api:1.7.22" level="project" />
5148
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
5249
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:2.6.0" level="project" />
5350
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:1.10.19" level="project" />
@@ -56,7 +53,7 @@
5653
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
5754
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.4.0" level="project" />
5855
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
59-
<orderEntry type="library" name="Maven: org.springframework:spring-core:4.3.12.RELEASE" level="project" />
60-
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:4.3.12.RELEASE" level="project" />
56+
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-core:4.3.6.RELEASE" level="project" />
57+
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:4.3.6.RELEASE" level="project" />
6158
</component>
6259
</module>
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package org.flylib.boot.starter.config;
2+
3+
import com.fasterxml.jackson.databind.DeserializationFeature;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.SerializationFeature;
6+
import org.flylib.boot.starter.filter.LoggingFilter;
7+
import org.flylib.boot.starter.interceptor.ResponseHandlerInterceptor;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
12+
import org.springframework.boot.web.servlet.FilterRegistrationBean;
13+
import org.springframework.context.annotation.Bean;
14+
import org.springframework.context.annotation.Configuration;
15+
import org.springframework.core.env.Environment;
16+
import org.springframework.http.MediaType;
17+
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
18+
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
19+
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
20+
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
21+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
22+
23+
import java.net.InetAddress;
24+
import java.net.UnknownHostException;
25+
import java.util.ArrayList;
26+
import java.util.List;
27+
28+
/**
29+
* mvc 配置类
30+
* 支持 velocity 和jsp视图解析
31+
* 加载顺序
32+
* 首先用ResourceBundleViewResolver 查找资源 如果差不多再根据velocity 视图解析器查找 如何还差不多就用jsp视图解析器
33+
* 2:ResourceBundleViewResolver
34+
* 3:VelocityViewResolver
35+
* 5:InternalResourceViewResolver
36+
* @author meixinbin
37+
* @2017-1-20
38+
*/
39+
@Configuration
40+
public class MvcConfig extends WebMvcConfigurerAdapter {
41+
42+
private Logger logger = LoggerFactory.getLogger(getClass());
43+
44+
@Autowired
45+
private Environment environment;
46+
47+
@Bean
48+
public HttpMessageConverters httpMessageConverters() {
49+
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
50+
jsonConverter.setPrefixJson(false);
51+
ObjectMapper objectMapper = new ObjectMapper();
52+
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
53+
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
54+
jsonConverter.setObjectMapper(objectMapper);
55+
List<MediaType> ls = new ArrayList<MediaType>();
56+
ls.add(new MediaType("application","json"));
57+
ls.add(new MediaType("text","json"));
58+
jsonConverter.setSupportedMediaTypes(ls);
59+
return new HttpMessageConverters(jsonConverter);
60+
}
61+
62+
@Override
63+
public void configurePathMatch(PathMatchConfigurer configurer) {
64+
}
65+
66+
@Override
67+
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
68+
configurer.mediaType(".*", new MediaType("application","json"));
69+
configurer.mediaType(".*", new MediaType("text","json"));
70+
}
71+
72+
73+
74+
@Override
75+
public void addInterceptors(InterceptorRegistry registry) {
76+
registry.addInterceptor(new ResponseHandlerInterceptor());
77+
super.addInterceptors(registry);
78+
}
79+
80+
@Bean
81+
public FilterRegistrationBean someFilterRegistration() {
82+
FilterRegistrationBean registration = new FilterRegistrationBean();
83+
try {
84+
// registration.setFilter(new LoggingFilter(InetAddress.getLocalHost().getHostAddress(),environment.getProperty("app.id")));
85+
registration.setFilter(new LoggingFilter(InetAddress.getLocalHost().getHostAddress()));
86+
} catch (UnknownHostException e) {
87+
logger.error("get server ip error",e);
88+
}
89+
registration.addUrlPatterns("/*");
90+
registration.setName("loggingFilter");
91+
registration.setOrder(Integer.MIN_VALUE);
92+
return registration;
93+
}
94+
95+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.flylib.boot.starter.filter;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.slf4j.MDC;
6+
import org.springframework.util.StringUtils;
7+
8+
import javax.servlet.*;
9+
import javax.servlet.http.HttpServletRequest;
10+
import javax.servlet.http.HttpServletResponse;
11+
import java.io.IOException;
12+
import java.util.UUID;
13+
14+
/**
15+
* @author liushaoming
16+
* @create 2017-12-04 11:03
17+
**/
18+
public class LoggingFilter implements Filter {
19+
private final Logger logger = LoggerFactory.getLogger(this.getClass());
20+
private final String ip;
21+
// private final String appId;
22+
23+
// public LoggingFilter(String ip, String appId) {
24+
// this.ip = ip;
25+
// this.appId = appId == null ? "" : appId;
26+
// }
27+
public LoggingFilter(String ip) {
28+
this.ip = ip;
29+
}
30+
31+
public void init(FilterConfig filterConfig) throws ServletException {
32+
}
33+
34+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
35+
HttpServletRequest req = (HttpServletRequest)request;
36+
HttpServletResponse res = (HttpServletResponse)response;
37+
// req.setAttribute("_accessTime", System.nanoTime());
38+
// boolean flag = false;
39+
// String url = req.getRequestURI();
40+
// String sessionId;
41+
// if (url.lastIndexOf(".") != -1) {
42+
// sessionId = url.substring(url.lastIndexOf(".") + 1, url.length());
43+
// if ("html".equalsIgnoreCase(sessionId) || "htm".equalsIgnoreCase(sessionId) || "jsp".equalsIgnoreCase(sessionId)) {
44+
// flag = true;
45+
// }
46+
// } else {
47+
// flag = true;
48+
// }
49+
//
50+
// if (flag) {
51+
// RequestIdUtils.setRequestId();
52+
// MDC.put("requestId", RequestIdUtils.getRequestId());
53+
// MDC.put("serverIp", this.ip);
54+
// MDC.put("appId", this.appId);
55+
// sessionId = CookieManager.getCookie("sessionId", req);
56+
// if (!StringUtils.hasText(sessionId)) {
57+
// sessionId = UUID.randomUUID().toString();
58+
// CookieManager.addCookieInMermory("sessionId", sessionId, "/", "", res);
59+
// }
60+
//
61+
// RequestIdUtils.setSessionId(sessionId);
62+
// MDC.put("sessionId", sessionId);
63+
// String referer = req.getHeader("referer");
64+
// String userAgent = req.getHeader("User-Agent");
65+
// this.logger.info("access info :{} \"{} {}\" {} \"{}\" \"{}\"", new Object[]{IPUtils.getIpAddr(req), req.getMethod(), req.getRequestURL(), req.getProtocol(), referer == null ? "" : referer, userAgent == null ? "" : userAgent});
66+
// }
67+
System.out.println("---Filter demo--->");
68+
chain.doFilter(request, response);
69+
}
70+
71+
public void destroy() {
72+
}
73+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.flylib.boot.starter.interceptor;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
5+
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.web.method.HandlerMethod;
9+
import org.springframework.web.servlet.HandlerInterceptor;
10+
import org.springframework.web.servlet.ModelAndView;
11+
12+
/**
13+
* @author liushaoming
14+
* @create 2017-12-04 10:29
15+
**/
16+
public class ResponseHandlerInterceptor implements HandlerInterceptor {
17+
private static final Logger logger = LoggerFactory.getLogger(ResponseHandlerInterceptor.class);
18+
19+
public ResponseHandlerInterceptor() {
20+
}
21+
22+
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
23+
request.setAttribute("startTime", System.currentTimeMillis());
24+
return true;
25+
}
26+
27+
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
28+
String contentType = request.getHeader("Accept");
29+
if (contentType != null && contentType.indexOf("json") != -1) {
30+
HandlerMethod handlerMethod = (HandlerMethod) handler;
31+
Class<?> clazz = handlerMethod.getReturnType().getMethod().getReturnType();
32+
if ("void".equals(clazz.toString())) {
33+
response.getWriter().write("{\"code\":\"0\",\"message\":\"ok\"}");
34+
}
35+
}
36+
37+
}
38+
39+
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
40+
long startTime = ((Long) request.getAttribute("startTime")).longValue();
41+
long endTime = System.currentTimeMillis();
42+
long executeTime = endTime - startTime;
43+
logger.info("[" + handler + "] executeTime :{} ms for request {}", executeTime, request.getRequestURI());
44+
}
45+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy