package cn.dreampie.common.config;
import cn.dreampie.common.log.Slf4jLogFactory;
import cn.dreampie.common.plugin.akka.AkkaPlugin;
import cn.dreampie.common.plugin.coffeescript.CoffeeScriptPlugin;
import cn.dreampie.common.plugin.db.FlywayPlugin;
import cn.dreampie.common.plugin.lesscss.LessCssPlugin;
import cn.dreampie.common.plugin.mail.MailerPlugin;
import cn.dreampie.common.plugin.shiro.MyJdbcAuthzService;
import cn.dreampie.common.plugin.shiro.freemarker.ShiroTags;
import cn.dreampie.common.plugin.shiro.plugin.ShiroInterceptor;
import cn.dreampie.common.plugin.shiro.plugin.ShiroPlugin;
import cn.dreampie.common.plugin.sqlinxml.SqlInXmlPlugin;
import cn.dreampie.common.plugin.tablebind.AutoMultiSourceTableBindPlugin;
import cn.dreampie.common.web.handler.AccessDeniedHandler;
import cn.dreampie.common.web.handler.FakeStaticHandler;
import cn.dreampie.common.web.handler.ResourceHandler;
import cn.dreampie.common.web.handler.SkipHandler;
import cn.dreampie.common.web.handler.xss.AttackHandler;
import cn.dreampie.common.web.interceptor.UrlInterceptor;
import cn.dreampie.common.web.render.JsonErrorRenderFactory;
import cn.dreampie.common.web.resource.freemarker.ResourceTags;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.config.*;
import com.jfinal.core.Const;
import com.jfinal.core.JFinal;
import com.jfinal.ext.interceptor.SessionInViewInterceptor;
import com.jfinal.ext.plugin.tablebind.SimpleNameStyles;
import com.jfinal.i18n.I18N;
import com.jfinal.log.Logger;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.AnsiSqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.render.FreeMarkerRender;
import freemarker.template.TemplateModelException;
import java.util.Locale;
/**
* Created with IntelliJ IDEA.
* User: wangrenhui
* Date: 13-12-18
* Time: 下午6:28
* API引导式配置
*/
public class AppConfig extends JFinalConfig {
/**
* 供Shiro插件使用。
*/
Routes routes;
/**
* 配置常量
*/
public void configConstant(Constants constants) {
loadPropertyFile("application.properties");
constants.setDevMode(getPropertyToBoolean("devMode", false));
// constants.setEncoding("UTF-8");
// I18N.init("messages", Locale.CHINA, Const.DEFAULT_I18N_MAX_AGE_OF_COOKIE);
//set log to slf4j
Logger.setLoggerFactory(new Slf4jLogFactory());
constants.setErrorRenderFactory(new JsonErrorRenderFactory());
constants.setI18n("messages", Locale.CHINA, Const.DEFAULT_I18N_MAX_AGE_OF_COOKIE);
constants.setError401View("/view/login.ftl");
constants.setError403View("/view/layout/403.ftl");
constants.setError404View("/view/layout/404.ftl");
constants.setError500View("/view/layout/500.ftl");
}
/**
* 配置路由
*/
public void configRoute(Routes routes) {
this.routes = routes;
AutoBindRoutes autoBindRoutes = new AutoBindRoutes();
routes.add(autoBindRoutes);
}
/**
* 配置插件
*/
public void configPlugin(Plugins plugins) {
//数据库版本控制插件
plugins.add(new FlywayPlugin());
//配置druid连接池
DruidPlugin druidDefault = new DruidPlugin(getProperty("db.default.url"), getProperty("db.default.user"), getProperty("db.default.password"), getProperty("db.default.driver"));
// StatFilter提供JDBC层的统计信息
druidDefault.addFilter(new StatFilter());
// WallFilter的功能是防御SQL注入攻击
WallFilter wallDefault = new WallFilter();
wallDefault.setDbType("h2");
druidDefault.addFilter(wallDefault);
druidDefault.setInitialSize(getPropertyToInt("db.default.poolInitialSize"));
druidDefault.setMaxPoolPreparedStatementPerConnectionSize(getPropertyToInt("db.default.poolMaxSize"));
druidDefault.setTimeBetweenConnectErrorMillis(getPropertyToInt("db.default.connectionTimeoutMillis"));
plugins.add(druidDefault);
//Model自动绑定表插件
AutoMultiSourceTableBindPlugin tableBindDefault = new AutoMultiSourceTableBindPlugin(druidDefault, SimpleNameStyles.LOWER);
tableBindDefault.setContainerFactory(new CaseInsensitiveContainerFactory(true)); //忽略字段大小写
// tableBindDefault.addExcludePaths("cn.dreampie.function.shop");
tableBindDefault.setShowSql(getPropertyToBoolean("devMode", false));
//非mysql的数据库方言
tableBindDefault.setDialect(new AnsiSqlDialect());
plugins.add(tableBindDefault);
//sql语句plugin
plugins.add(new SqlInXmlPlugin());
//ehcache缓存
plugins.add(new EhCachePlugin());
//shiro权限框架
plugins.add(new ShiroPlugin(routes, new MyJdbcAuthzService()));
//akka异步执行插件
plugins.add(new AkkaPlugin());
//emailer插件
plugins.add(new MailerPlugin());
//quartz
// plugins.add(new QuartzPlugin());
plugins.add(new CoffeeScriptPlugin());
plugins.add(new LessCssPlugin());
}
/**
* 配置全局拦截器
*/
public void configInterceptor(Interceptors interceptors) {
interceptors.add(new ShiroInterceptor());
// interceptors.add(new CacheRemoveInterceptor());
// interceptors.add(new CacheInterceptor());
interceptors.add(new SessionInViewInterceptor());
// interceptors.add(new TxByRegex("^(/[a-z0-9]*/)*(save|update|delete|drop)[a-z0-9/]*$",false));
interceptors.add(new UrlInterceptor());
}
/**
* 配置处理器
*/
public void configHandler(Handlers handlers) {
// handlers.add(new FakeStaticHandler("/page", ".ftl", "/view/layout/", new String[]{"/javascript/", "/images/", "/css/", "/libs/"},new String[]{"/im/"}));
handlers.add(new FakeStaticHandler());
handlers.add(new AccessDeniedHandler("/**/*.ftl"));
handlers.add(new ResourceHandler("/javascript/**", "/images/**", "/css/**", "/libs/**", "/**/*.html"));
handlers.add(new SkipHandler("/im/**"));
//防xss攻击
handlers.add(new AttackHandler());
}
@Override
public void afterJFinalStart() {
super.afterJFinalStart();
FreeMarkerRender.setProperties(loadPropertyFile("freemarker.properties"));
FreeMarkerRender.getConfiguration().setSharedVariable("shiro", new ShiroTags());
FreeMarkerRender.getConfiguration().setSharedVariable("resource", new ResourceTags());
try {
FreeMarkerRender.getConfiguration().setSharedVariable("i18n", I18N.me());
} catch (TemplateModelException e) {
e.printStackTrace();
}
}
/**
* 建议使用 JFinal 手册推荐的方式启动项目
* 运行此 main 方法可以启动项目,此main方法可以放置在任意的Class类定义中,不一定要放于此
*/
public static void main(String[] args) {
JFinal.start("src/main/webapp", 80, "/", 5);
}
}