mirror of
https://gitee.com/EMF/solon-manager.git
synced 2025-12-06 08:48:33 +08:00
mod: 前台缓存、后台权限、更换cms渲染器
This commit is contained in:
parent
e58b3e870c
commit
ed1b5aad3e
File diff suppressed because one or more lines are too long
@ -27,10 +27,10 @@ public final class CommonAttribute {
|
||||
public static final String FRONT_PATH="/cms/";
|
||||
|
||||
/** 后台错误页面 */
|
||||
public static final String ADMIN_ERROR_VIEW = ADMIN_PATH+"error/500.html";
|
||||
public static final String ADMIN_ERROR_VIEW = "error/500.html";
|
||||
|
||||
/** 后台权限错误页面 */
|
||||
public static final String ADMIN_UNAUTHORIZED_VIEW = ADMIN_PATH+"error/403.html";
|
||||
public static final String ADMIN_UNAUTHORIZED_VIEW = "error/403.html";
|
||||
|
||||
/** 前台错误页面 */
|
||||
public static final String FRONT_ERROR_VIEW = "/500.html";
|
||||
|
||||
@ -0,0 +1,147 @@
|
||||
package vip.fuck.sm.plugins.cms.config;
|
||||
|
||||
import cn.hutool.core.util.HashUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.jfinal.template.Directive;
|
||||
import com.jfinal.template.Engine;
|
||||
import com.jfinal.template.Template;
|
||||
import org.noear.solon.annotation.Component;
|
||||
import org.noear.solon.boot.ServerProps;
|
||||
import org.noear.solon.core.handle.Context;
|
||||
import org.noear.solon.core.handle.ModelAndView;
|
||||
import org.noear.solon.core.util.SupplierEx;
|
||||
import org.noear.solon.data.cache.LocalCacheService;
|
||||
import org.noear.solon.view.ViewConfig;
|
||||
import org.noear.solon.view.enjoy.EnjoyDirectiveFactory;
|
||||
import org.noear.solon.view.enjoy.EnjoyRender;
|
||||
import vip.fuck.sm.plugins.cms.filter.PageCacheFilter;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
|
||||
public class CmsEnjoyRender extends EnjoyRender {
|
||||
|
||||
EnjoyRender enjoyRender;
|
||||
LocalCacheService localCacheService;
|
||||
public CmsEnjoyRender(EnjoyRender enjoyRender , LocalCacheService localCacheService) {
|
||||
this.enjoyRender = enjoyRender;
|
||||
this.localCacheService = localCacheService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Engine getProvider() {
|
||||
return enjoyRender.getProvider();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Engine getProviderOfDebug() {
|
||||
return enjoyRender.getProviderOfDebug();
|
||||
}
|
||||
|
||||
public CmsEnjoyRender() {
|
||||
super();
|
||||
}
|
||||
|
||||
public CmsEnjoyRender(ClassLoader classLoader) {
|
||||
super(classLoader);
|
||||
}
|
||||
|
||||
public CmsEnjoyRender(ClassLoader classLoader, String viewPrefix) {
|
||||
super(classLoader, viewPrefix);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putDirective(String name, Class<? extends Directive> clz) {
|
||||
enjoyRender.putDirective(name, clz);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putDirective(String name, EnjoyDirectiveFactory directiveFactory) {
|
||||
enjoyRender.putDirective(name, directiveFactory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putVariable(String name, Object value) {
|
||||
enjoyRender.putVariable(name, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putFunction(String path) {
|
||||
enjoyRender.putFunction(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(Object obj, Context ctx) throws Throwable {
|
||||
if (obj == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (obj instanceof ModelAndView) {
|
||||
this.render_mav((ModelAndView) obj, ctx, ctx::outputStream);
|
||||
} else {
|
||||
ctx.output(obj.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String renderAndReturn(Object obj, Context ctx) throws Throwable {
|
||||
if (obj == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (obj instanceof ModelAndView) {
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
render_mav((ModelAndView) obj, ctx, () -> outputStream);
|
||||
return outputStream.toString();
|
||||
} else {
|
||||
return obj.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render_mav(ModelAndView mv, Context ctx, SupplierEx<OutputStream> outputStream) throws Throwable {
|
||||
if (ctx.contentTypeNew() == null) {
|
||||
ctx.contentType("text/html;charset=utf-8");
|
||||
}
|
||||
|
||||
if (ViewConfig.isOutputMeta()) {
|
||||
ctx.headerSet(ViewConfig.HEADER_VIEW_META, "MyEnjoyRender");
|
||||
}
|
||||
|
||||
//添加 context 变量
|
||||
mv.putIfAbsent("context", ctx);
|
||||
|
||||
Template template = null;
|
||||
|
||||
if (super.getProviderOfDebug() != null) {
|
||||
try {
|
||||
template = super.getProviderOfDebug().getTemplate(mv.view());
|
||||
} catch (Exception e) {
|
||||
//忽略不计
|
||||
}
|
||||
}
|
||||
|
||||
if (template == null) {
|
||||
template = super.getProvider().getTemplate(mv.view());
|
||||
}
|
||||
|
||||
// 输出流
|
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream.get(), ServerProps.response_encoding));
|
||||
String mvStr = template.renderToString(mv.model());
|
||||
if(mvStr!=null && PageCacheFilter.isCache(ctx.pathNew())){
|
||||
String jsonStr = JSONUtil.toJsonStr(ctx.paramMap());
|
||||
long hash64 = HashUtil.metroHash64(jsonStr.getBytes(StandardCharsets.UTF_8));
|
||||
localCacheService.store(PageCacheFilter.CMS_PAGE_CACHE+ctx.pathNew()+"_"+hash64,mvStr,3*60);
|
||||
}
|
||||
writer.write(mvStr);
|
||||
// template.render(mv.model(), writer);
|
||||
|
||||
writer.flush();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -8,13 +8,17 @@ import com.jfinal.template.ext.spring.JFinalView;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.noear.solon.Solon;
|
||||
import org.noear.solon.annotation.Bean;
|
||||
import org.noear.solon.annotation.Component;
|
||||
import org.noear.solon.annotation.Configuration;
|
||||
import org.noear.solon.annotation.Inject;
|
||||
import org.noear.solon.data.cache.CacheService;
|
||||
import org.noear.solon.data.cache.LocalCacheService;
|
||||
import org.noear.solon.view.enjoy.EnjoyRender;
|
||||
import vip.fuck.sm.plugins.cms.entity._MappingKit;
|
||||
import vip.fuck.sm.plugins.cms.util.JFinal;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.Properties;
|
||||
|
||||
@Configuration
|
||||
public class Configxv {
|
||||
@ -24,7 +28,10 @@ public class Configxv {
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
|
||||
@Bean("cmsCacheService")
|
||||
public CacheService cmsCacheService() {
|
||||
return new LocalCacheService();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public void cx(@Db("main") ActiveRecordPlugin arp){
|
||||
@ -37,9 +44,13 @@ public class Configxv {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Bean
|
||||
public void putbase(@Inject EnjoyRender enjoyRender){
|
||||
public void putbase(@Inject EnjoyRender enjoyRender , @Inject("cmsCacheService") LocalCacheService localCacheService){
|
||||
enjoyRender.putVariable("base", JFinal.getContextPath());
|
||||
CmsEnjoyRender render = new CmsEnjoyRender(enjoyRender,localCacheService);
|
||||
Solon.app().renderManager().register(".shtm", render);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -131,10 +131,13 @@ public class BaseController {
|
||||
}
|
||||
|
||||
protected Integer getParaToInt(String name){
|
||||
if(Context.current().paramNames().contains(name)){
|
||||
String v = Context.current().param(name);
|
||||
if(ObjectUtil.isNull(v)){
|
||||
return null;
|
||||
} else if(NumberUtil.isInteger(v) ){
|
||||
return Context.current().paramAsInt(name);
|
||||
}else{
|
||||
return null;
|
||||
throw new RuntimeException("参数错误");
|
||||
}
|
||||
}
|
||||
|
||||
@ -254,7 +257,7 @@ public class BaseController {
|
||||
view = fixedSubfix(view);
|
||||
Site currSite = getCurrentSite();
|
||||
if (ObjectUtil.isEmpty(currSite)) {
|
||||
Site currentSite = new Site().dao().findById(1);
|
||||
Site currentSite = new Site().findDefault();
|
||||
getSession().sessionSet(Site.ADMIN_SESSION_SITE, currentSite);
|
||||
}
|
||||
return new ModelAndView(CommonAttribute.ADMIN_PATH+view);
|
||||
@ -289,14 +292,6 @@ public class BaseController {
|
||||
}
|
||||
}
|
||||
Context current = Context.current();
|
||||
SessionState s = getSession();
|
||||
JSONObject session = JSONUtil.createObj();
|
||||
if(ObjectUtil.isNotEmpty(s.sessionKeys())){
|
||||
for (String sessionKey : s.sessionKeys()) {
|
||||
session.set(sessionKey,s.sessionGet(sessionKey));
|
||||
}
|
||||
}
|
||||
view.put("session",session);
|
||||
if(kv!=null){
|
||||
|
||||
for (int i = 0; i < kv.length; i+=2) {
|
||||
|
||||
@ -57,6 +57,9 @@ public class IndexController extends BaseController {
|
||||
}
|
||||
}
|
||||
Site currentSite = new Site().dao().findById(siteId);
|
||||
if(currentSite==null){
|
||||
currentSite = new Site().findDefault();
|
||||
}
|
||||
getSession().sessionSet(Site.ADMIN_SESSION_SITE, currentSite);
|
||||
//统计
|
||||
setAttr("contentCount", Db.queryInt("select count(*) from cms_content"));
|
||||
|
||||
@ -25,10 +25,7 @@ import vip.fuck.sm.plugins.cms.entity.base.BaseModel;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Controller - 管理员登录
|
||||
@ -97,7 +94,7 @@ public class LoginController extends BaseController {
|
||||
}
|
||||
for (Method f : ms) {
|
||||
if(f.getName().startsWith("get") && f.getReturnType() != Void.class && f.getParameterTypes().length ==0 ){
|
||||
System.out.println(m.getClass().getName()+"."+ f.getName()+"();");
|
||||
// System.out.println(m.getClass().getName()+"."+ f.getName()+"();");
|
||||
Object value = ReflectUtil.invoke(m, f);
|
||||
if(value instanceof Model){
|
||||
value = toJSONObject((Model) value,models);
|
||||
|
||||
@ -45,7 +45,7 @@ public class BaseController extends vip.fuck.sm.plugins.cms.controller.admin.Ba
|
||||
view = fixedSubfix(view);
|
||||
Site currSite = getCurrentSite();
|
||||
if (ObjectUtil.isEmpty(currSite)) {
|
||||
Site currentSite = new Site().dao().findById(1);
|
||||
Site currentSite = new Site().findDefault();
|
||||
getSession().sessionSet(Site.ADMIN_SESSION_SITE, currentSite);
|
||||
}
|
||||
String pcTemplate = currSite.getPcTemplate();
|
||||
|
||||
@ -1,51 +1,89 @@
|
||||
//package vip.fuck.sm.plugins.cms.filter;
|
||||
//
|
||||
//
|
||||
//import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter;
|
||||
//import org.apache.commons.lang.BooleanUtils;
|
||||
//import org.noear.solon.core.handle.FilterChain;
|
||||
//import org.smartboot.http.server.HttpRequest;
|
||||
//import org.smartboot.http.server.HttpResponse;
|
||||
//import vip.fuck.sm.plugins.cms.Config;
|
||||
//import vip.fuck.sm.plugins.cms.util.SystemUtils;
|
||||
//
|
||||
//
|
||||
//
|
||||
//public class PageCacheFilter extends SimplePageCachingFilter {
|
||||
//
|
||||
// @Override
|
||||
// protected void doFilter(HttpRequest request, HttpResponse response, FilterChain chain)
|
||||
// throws Exception {
|
||||
// // TODO Auto-generated method stub
|
||||
// Config config = SystemUtils.getConfig();
|
||||
// if (BooleanUtils.isTrue(config.getIsCacheEnabled())
|
||||
// && isCache(request.getRequestURI())) {
|
||||
// super.doFilter(request, response, chain);
|
||||
// } else {
|
||||
// chain.doFilter(request, response);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private boolean isCache(String requestURI) {
|
||||
// if (requestURI.startsWith("/api/")
|
||||
// || requestURI.startsWith("/category/")
|
||||
// || requestURI.startsWith("/content/")
|
||||
// ) {
|
||||
// return false;
|
||||
// }
|
||||
// //通过正则表达式判断是否缓存该页面
|
||||
// String[] cacheUrl = new String[] {
|
||||
// "^/$",//首页
|
||||
// "^/[A-Za-z0-9_]+$",//栏目页
|
||||
// "^/[A-Za-z0-9_]+/\\d+$" //详情页
|
||||
// };
|
||||
// for (String string : cacheUrl) {
|
||||
// if (requestURI.matches(string)) {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
//
|
||||
//}
|
||||
package vip.fuck.sm.plugins.cms.filter;
|
||||
|
||||
import cn.hutool.core.util.HashUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import org.apache.commons.lang.BooleanUtils;
|
||||
import org.noear.solon.annotation.Component;
|
||||
import org.noear.solon.annotation.Inject;
|
||||
import org.noear.solon.core.handle.Context;
|
||||
import org.noear.solon.core.handle.Handler;
|
||||
import org.noear.solon.core.handle.SessionState;
|
||||
import org.noear.solon.core.route.RouterInterceptor;
|
||||
import org.noear.solon.core.route.RouterInterceptorChain;
|
||||
import org.noear.solon.core.util.LogUtil;
|
||||
import org.noear.solon.data.cache.LocalCacheService;
|
||||
import vip.fuck.sm.plugins.cms.Config;
|
||||
import vip.fuck.sm.plugins.cms.util.SystemUtils;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
@Component
|
||||
public class PageCacheFilter implements RouterInterceptor {
|
||||
|
||||
public static final String CMS_PAGE_CACHE ="cms_page_cache";
|
||||
|
||||
@Inject("cmsCacheService")
|
||||
LocalCacheService cmsCacheService;
|
||||
|
||||
public static boolean isCache(String requestURI) {
|
||||
if (requestURI.startsWith("/api/cms/")
|
||||
|| requestURI.startsWith("/cms/category/")
|
||||
|| requestURI.startsWith("/cms/content/")
|
||||
|| requestURI.startsWith("/cms/admin")
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
//通过正则表达式判断是否缓存该页面
|
||||
String[] cacheUrl = new String[] {
|
||||
"^/cms/*$",//首页
|
||||
"^/cms/[A-Za-z0-9_]+/*$",//栏目页
|
||||
"^/cms/[A-Za-z0-9_]+/\\d+/*$" //详情页
|
||||
};
|
||||
for (String string : cacheUrl) {
|
||||
if (requestURI.matches(string)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
|
||||
SessionState s = ctx.sessionState();
|
||||
System.out.println(ctx.pathNew());
|
||||
LogUtil.global().info("pathNew:"+ctx.pathNew());
|
||||
LogUtil.global().info("paramMap:"+ctx.paramMap());
|
||||
JSONObject session = JSONUtil.createObj();
|
||||
if(ObjectUtil.isNotEmpty(s.sessionKeys())){
|
||||
for (String sessionKey : s.sessionKeys()) {
|
||||
session.set(sessionKey,s.sessionGet(sessionKey));
|
||||
}
|
||||
}
|
||||
ctx.attrSet("session",session);
|
||||
String pathNew = ctx.pathNew();
|
||||
Config config = SystemUtils.getConfig();
|
||||
if ( BooleanUtils.isTrue(config.getIsCacheEnabled())
|
||||
&& isCache(pathNew)) {
|
||||
String jsonStr = JSONUtil.toJsonStr(ctx.paramMap());
|
||||
long hash64 = HashUtil.metroHash64(jsonStr.getBytes(StandardCharsets.UTF_8));
|
||||
String o = cmsCacheService.get(PageCacheFilter.CMS_PAGE_CACHE+ctx.pathNew()+"_"+hash64,String.class);
|
||||
if(o!=null){
|
||||
ctx.outputAsHtml(o);
|
||||
LogUtil.global().info("pageCache_outputAsHtml:"+ctx.pathNew());
|
||||
return;
|
||||
}
|
||||
}
|
||||
chain.doIntercept(ctx, mainHandler);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,121 +1,125 @@
|
||||
//package vip.fuck.sm.plugins.cms.filter;
|
||||
//
|
||||
//import com.alibaba.fastjson.JSONObject;
|
||||
//import com.cms.Feedback;
|
||||
//import com.cms.entity.Admin;
|
||||
//import com.cms.util.WebUtils;
|
||||
//import org.apache.commons.lang.BooleanUtils;
|
||||
//
|
||||
//import javax.servlet.*;
|
||||
//import javax.servlet.http.HttpServletRequest;
|
||||
//import javax.servlet.http.HttpServletResponse;
|
||||
//import java.io.IOException;
|
||||
//import java.io.PrintWriter;
|
||||
//import java.util.ArrayList;
|
||||
//import java.util.List;
|
||||
//
|
||||
//public class PermissionFilter implements Filter{
|
||||
//
|
||||
// /** 不包含 */
|
||||
// private List<String> adminExcludes = new ArrayList<String>(){{
|
||||
// add("/admin/login");
|
||||
// add("/admin/error");
|
||||
// add("/admin/static");
|
||||
// }};
|
||||
//
|
||||
// /** 不包含 */
|
||||
// private List<String> permissionExcludes = new ArrayList<String>(){{
|
||||
// add("/admin/logout");
|
||||
// add("/admin/index");
|
||||
// add("/admin/file");
|
||||
// add("/admin/cache");
|
||||
// add("/admin/profile");
|
||||
// }};
|
||||
//
|
||||
// @Override
|
||||
// public void init(FilterConfig filterConfig) throws ServletException {
|
||||
// // TODO Auto-generated method stub
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
|
||||
// throws IOException, ServletException {
|
||||
// // TODO Auto-generated method stub
|
||||
// HttpServletRequest request = (HttpServletRequest)servletRequest;
|
||||
// HttpServletResponse response = (HttpServletResponse)servletResponse;
|
||||
// String url = request.getRequestURI().toString();
|
||||
// String contextPath = request.getContextPath();
|
||||
// url = url.substring(contextPath.length());
|
||||
// //匹配admin
|
||||
// for(String key : adminExcludes){
|
||||
// if(url.startsWith(key)){
|
||||
// filterChain.doFilter(servletRequest, servletResponse);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// Admin currentAdmin = (Admin) request.getSession().getAttribute(Admin.SESSION_ADMIN);
|
||||
// if(currentAdmin!=null){
|
||||
// //演示程序不允许修改、新增、删除开始
|
||||
// if("read".equals(currentAdmin.getUsername())){
|
||||
// String lowerUrl = url.toLowerCase();
|
||||
// if(lowerUrl.contains("save")
|
||||
// || lowerUrl.contains("update")
|
||||
// || lowerUrl.contains("delete")
|
||||
// || lowerUrl.contains("backup")
|
||||
// || lowerUrl.contains("restore")
|
||||
// || lowerUrl.contains("setDefault".toLowerCase())
|
||||
// || lowerUrl.contains("generate")
|
||||
// ){
|
||||
// if(WebUtils.isAjaxRequest(request)){
|
||||
// //是ajax操作
|
||||
// response.setContentType("application/json;charset=UTF-8");
|
||||
// PrintWriter writer = response.getWriter();
|
||||
// writer.write(JSONObject.toJSONString(Feedback.error("演示账号不允许操作!")));
|
||||
// writer.flush();
|
||||
// writer.close();
|
||||
// return;
|
||||
// }else{
|
||||
// //是url操作
|
||||
// response.setContentType("text/html;charset=utf-8");
|
||||
// PrintWriter writer = response.getWriter();
|
||||
// writer.write("<script>alert('演示账号不允许操作!');history.back();</script>");
|
||||
// writer.flush();
|
||||
// writer.close();
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// //演示程序不允许修改、新增、删除结束
|
||||
// //系统内置角色
|
||||
// if(currentAdmin.getRole()!=null && BooleanUtils.isTrue(currentAdmin.getRole().getIsSystem())){
|
||||
// filterChain.doFilter(servletRequest, servletResponse);
|
||||
// return;
|
||||
// }
|
||||
// for(String key : permissionExcludes){
|
||||
// if(url.startsWith(key)){
|
||||
// filterChain.doFilter(servletRequest, servletResponse);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// List<String> permissions = currentAdmin.getPermissions();
|
||||
// for(String key : permissions){
|
||||
// if(url.startsWith(key)){
|
||||
// filterChain.doFilter(servletRequest, servletResponse);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// response.sendRedirect(contextPath+"/admin/error/unauthorized");
|
||||
// return;
|
||||
// }
|
||||
// response.sendRedirect(contextPath+"/admin/login");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void destroy() {
|
||||
// // TODO Auto-generated method stub
|
||||
//
|
||||
// }
|
||||
//
|
||||
//}
|
||||
package vip.fuck.sm.plugins.cms.filter;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import org.apache.commons.lang.BooleanUtils;
|
||||
import org.noear.solon.Solon;
|
||||
import org.noear.solon.annotation.Component;
|
||||
import org.noear.solon.annotation.Inject;
|
||||
import org.noear.solon.core.handle.Context;
|
||||
import org.noear.solon.core.handle.Filter;
|
||||
import org.noear.solon.core.handle.FilterChain;
|
||||
import org.noear.solon.core.handle.SessionState;
|
||||
import org.noear.solon.data.cache.LocalCacheService;
|
||||
import org.smartboot.http.server.HttpRequest;
|
||||
import org.smartboot.http.server.HttpResponse;
|
||||
import vip.fuck.sm.plugins.cms.Feedback;
|
||||
import vip.fuck.sm.plugins.cms.entity.Admin;
|
||||
import vip.fuck.sm.plugins.cms.util.JFinal;
|
||||
import vip.fuck.sm.plugins.cms.util.WebUtils;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
public class PermissionFilter implements Filter {
|
||||
|
||||
|
||||
|
||||
/** 不包含 */
|
||||
private static List<String> adminExcludes = new ArrayList<String>(){{
|
||||
add("/cms/admin/login");
|
||||
add("/cms/admin/error");
|
||||
add("/cms/admin/static");
|
||||
}};
|
||||
|
||||
/** 不包含 */
|
||||
private static List<String> permissionExcludes = new ArrayList<String>(){{
|
||||
add("/cms/admin/logout");
|
||||
add("/cms/admin/index");
|
||||
add("/cms/admin/file");
|
||||
add("/cms/admin/cache");
|
||||
add("/cms/admin/profile");
|
||||
}};
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void doFilter(Context ctx, FilterChain filterChain) throws Throwable {
|
||||
|
||||
// TODO Auto-generated method stub
|
||||
HttpRequest request = (HttpRequest) ctx.request();
|
||||
HttpResponse response = (HttpResponse) ctx.response();
|
||||
String url = ctx.pathNew();
|
||||
//匹配admin
|
||||
for(String key : adminExcludes){
|
||||
if(url.startsWith(key)){
|
||||
filterChain.doFilter(ctx);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(url.startsWith("/cms/admin")){
|
||||
JSONObject currentAdmin = ctx.session(Admin.SESSION_ADMIN, cn.hutool.json.JSONObject.class);
|
||||
if(currentAdmin!=null){
|
||||
//演示程序不允许修改、新增、删除开始
|
||||
if("read".equals(currentAdmin.getStr("username"))){
|
||||
String lowerUrl = url.toLowerCase();
|
||||
if(lowerUrl.contains("save")
|
||||
|| lowerUrl.contains("update")
|
||||
|| lowerUrl.contains("delete")
|
||||
|| lowerUrl.contains("backup")
|
||||
|| lowerUrl.contains("restore")
|
||||
|| lowerUrl.contains("setDefault".toLowerCase())
|
||||
|| lowerUrl.contains("generate")
|
||||
){
|
||||
if(WebUtils.isAjaxRequest(request)){
|
||||
//是ajax操作
|
||||
ctx.renderAndReturn(Feedback.error("演示账号不允许操作!"));
|
||||
return;
|
||||
}else{
|
||||
//是url操作
|
||||
response.setContentType("text/html;charset=utf-8");
|
||||
response.write("<script>alert('演示账号不允许操作!');history.back();</script>"
|
||||
.getBytes(StandardCharsets.UTF_8));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
//演示程序不允许修改、新增、删除结束
|
||||
//系统内置角色
|
||||
if(currentAdmin.getObj("role")!=null && BooleanUtils.isTrue(currentAdmin.getJSONObject("role")
|
||||
.getBool("getIsSystem"))){
|
||||
filterChain.doFilter(ctx);
|
||||
return;
|
||||
}
|
||||
for(String key : permissionExcludes){
|
||||
if(url.startsWith(key)){
|
||||
filterChain.doFilter(ctx);
|
||||
return;
|
||||
}
|
||||
}
|
||||
List<String> permissions = currentAdmin.getBeanList("permissions",String.class);
|
||||
for(String key : permissions){
|
||||
if(url.startsWith(key)){
|
||||
filterChain.doFilter(ctx);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ctx.forward("/cms/admin/error/unauthorized");
|
||||
return;
|
||||
}
|
||||
ctx.pathNew("/cms/admin/login");
|
||||
}
|
||||
filterChain.doFilter(ctx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ public class SiteHandler
|
||||
String[] urls = target.split("/");
|
||||
Integer siteNum = Db.queryInt("select count(*) from cms_site where domain=?",domain);
|
||||
if(siteNum == null || siteNum<1){
|
||||
if(urls.length<1){
|
||||
if(urls.length<=2){
|
||||
//默认站点
|
||||
Site site = new Site().dao().findDefault();
|
||||
wrappedRequest(site,ctx,chain, target);
|
||||
|
||||
@ -92,7 +92,8 @@ public class UrlHandler implements Filter {
|
||||
Tag tag = new Tag().dao().findByCat(tagCat);
|
||||
if(tag!=null){
|
||||
ctx.paramMap().put("id",tag.getId()+"");
|
||||
ctx.forward("/cms/tag");
|
||||
ctx.pathNew("/cms/tag");
|
||||
chain.doFilter(ctx);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -122,7 +123,8 @@ public class UrlHandler implements Filter {
|
||||
if(StringUtils.isNotBlank(newTarget)){
|
||||
target = newTarget;
|
||||
}
|
||||
ctx.forward(target);
|
||||
ctx.pathNew(target);
|
||||
chain.doFilter(ctx);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@ import org.noear.solon.Solon;
|
||||
public class JFinal {
|
||||
|
||||
public static String getContextPath() {
|
||||
String contextPath = Solon.cfg().get("server.contextPath","/");
|
||||
String contextPath = Solon.cfg().get("server.contextPath","");
|
||||
String port = Solon.cfg().get("server.port","");
|
||||
String schema = Solon.cfg().get("server.schema");
|
||||
String domain = Solon.cfg().get("server.domain","localhost");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user