/**
|
* Copyright 2018-2020 stylefeng & fengshuonan (sn93@qq.com)
|
* <p>
|
* 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
|
* <p>
|
* http://www.apache.org/licenses/LICENSE-2.0
|
* <p>
|
* 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<HttpMessageConverter<?>> 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<RequestContextListener> requestContextListenerRegistration() {
|
return new ServletListenerRegistrationBean<>(new RequestContextListener());
|
}
|
|
/**
|
* ConfigListener注册
|
*/
|
@Bean
|
public ServletListenerRegistrationBean<ConfigListener> 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;
|
}
|
}
|