/** * Copyright 2018-2020 stylefeng & fengshuonan (sn93@qq.com) *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cn.stylefeng.guns.config.web; import cn.stylefeng.guns.sys.core.exception.page.GunsErrorView; import cn.stylefeng.guns.sys.core.listener.ConfigListener; import cn.stylefeng.roses.core.xss.XssFilter; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator; import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.aop.Advisor; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.JdkRegexpMethodPointcut; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.context.request.RequestContextListener; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.Arrays; import java.util.List; import java.util.Properties; /** * web 配置类 * * @author fengshuonan * @date 2016年11月12日 下午5:03:32 */ @Configuration public class WebConfig implements WebMvcConfigurer { /** * 配置string解析器放在json解析器前边 * * @author fengshuonan * @Date 2019/8/7 23:09 */ @Override public void configureMessageConverters(List> converters) { HttpMessageConverter httpMessageConverter = converters.get(0); converters.remove(0); converters.add(2, httpMessageConverter); } /** * 静态资源映射 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //swagger registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); //本应用 registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/"); //流程设计器 registry.addResourceHandler("/activiti-editor/**").addResourceLocations("classpath:/activiti-editor/"); } /** * 默认错误页面,返回json */ @Bean("error") public GunsErrorView error() { return new GunsErrorView(); } /** * druidServlet注册 */ @Bean public ServletRegistrationBean druidServletRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean(new StatViewServlet()); registration.addUrlMappings("/druid/*"); return registration; } /** * druid监控 配置URI拦截策略 */ @Bean public FilterRegistrationBean druidStatFilter() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); //添加过滤规则. filterRegistrationBean.addUrlPatterns("/*"); //添加不需要忽略的格式信息. filterRegistrationBean.addInitParameter( "exclusions", "/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid,/druid/*"); //用于session监控页面的用户名显示 需要登录后主动将username注入到session里 filterRegistrationBean.addInitParameter("principalSessionName", "username"); return filterRegistrationBean; } /** * druid数据库连接池监控 */ @Bean public DruidStatInterceptor druidStatInterceptor() { return new DruidStatInterceptor(); } @Bean public JdkRegexpMethodPointcut druidStatPointcut() { JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut(); String patterns = "cn.stylefeng.guns.modular.*.service.*"; //可以set多个 druidStatPointcut.setPatterns(patterns); return druidStatPointcut; } /** * druid数据库连接池监控 */ @Bean public BeanTypeAutoProxyCreator beanTypeAutoProxyCreator() { BeanTypeAutoProxyCreator beanTypeAutoProxyCreator = new BeanTypeAutoProxyCreator(); beanTypeAutoProxyCreator.setTargetBeanType(DruidDataSource.class); beanTypeAutoProxyCreator.setInterceptorNames("druidStatInterceptor"); return beanTypeAutoProxyCreator; } /** * druid 为druidStatPointcut添加拦截 * * @return */ @Bean public Advisor druidStatAdvisor() { return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor()); } /** * xssFilter注册 */ @Bean public FilterRegistrationBean xssFilterRegistration() { XssFilter xssFilter = new XssFilter(); xssFilter.setUrlExclusion(Arrays.asList("/notice/add", "/notice/update", "/excelExportDeploy/editItem", "/excelExportDeploy/addItem")); FilterRegistrationBean registration = new FilterRegistrationBean(xssFilter); registration.addUrlPatterns("/*"); return registration; } /** * RequestContextListener注册 */ @Bean public ServletListenerRegistrationBean requestContextListenerRegistration() { return new ServletListenerRegistrationBean<>(new RequestContextListener()); } /** * ConfigListener注册 */ @Bean public ServletListenerRegistrationBean configListenerRegistration() { return new ServletListenerRegistrationBean<>(new ConfigListener()); } /** * 验证码生成相关 */ @Bean public DefaultKaptcha kaptcha() { Properties properties = new Properties(); properties.put("kaptcha.border", "no"); properties.put("kaptcha.border.color", "105,179,90"); properties.put("kaptcha.textproducer.font.color", "blue"); properties.put("kaptcha.image.width", "125"); properties.put("kaptcha.image.height", "45"); properties.put("kaptcha.textproducer.font.size", "45"); properties.put("kaptcha.session.key", "code"); properties.put("kaptcha.textproducer.char.length", "4"); properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑"); Config config = new Config(properties); DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); defaultKaptcha.setConfig(config); return defaultKaptcha; } }