结果如下图所示
java类代码分别如下
1
package com. hdx. contractor. util. mybatis ;
import com. hdx. contractor. common. user. SecurityUser ;
import com. hdx. contractor. common. user. UserDetail ;
import com. hdx. contractor. util. query. oConvertUtils ;
import lombok. extern. slf4j. Slf4j ;
import org. apache. ibatis. binding. MapperMethod. ParamMap ;
import org. apache. ibatis. executor. Executor ;
import org. apache. ibatis. mapping. MappedStatement ;
import org. apache. ibatis. mapping. SqlCommandType ;
import org. apache. ibatis. plugin. * ;
import org. springframework. stereotype. Component ;
import java. lang. reflect. Field ;
import java. util. Date ;
import java. util. Properties ;
@Slf4j
@Component
@Intercepts ( { @Signature ( type = Executor . class , method = "update" , args = { MappedStatement . class , Object . class } ) } )
public class MybatisInterceptor implements Interceptor {
@Override
public Object intercept ( Invocation invocation) throws Throwable {
MappedStatement mappedStatement = ( MappedStatement ) invocation. getArgs ( ) [ 0 ] ;
String sqlId = mappedStatement. getId ( ) ;
log. debug ( "------sqlId------" + sqlId) ;
SqlCommandType sqlCommandType = mappedStatement. getSqlCommandType ( ) ;
Object parameter = invocation. getArgs ( ) [ 1 ] ;
log. debug ( "------sqlCommandType------" + sqlCommandType) ;
if ( parameter == null ) {
return invocation. proceed ( ) ;
}
if ( SqlCommandType . INSERT == sqlCommandType) {
UserDetail sysUser = this . getLoginUser ( ) ;
Field [ ] fields = oConvertUtils. getAllFields ( parameter) ;
for ( Field field : fields) {
log. debug ( "------field.name------" + field. getName ( ) ) ;
try {
if ( "createBy" . equals ( field. getName ( ) ) ) {
field. setAccessible ( true ) ;
Object localCreateBy = field. get ( parameter) ;
field. setAccessible ( false ) ;
if ( localCreateBy == null || "" . equals ( localCreateBy) ) {
if ( sysUser != null ) {
field. setAccessible ( true ) ;
field. set ( parameter, sysUser. getUsername ( ) ) ;
field. setAccessible ( false ) ;
}
}
}
if ( "userId" . equals ( field. getName ( ) ) ) {
field. setAccessible ( true ) ;
Object localuserId = field. get ( parameter) ;
field. setAccessible ( false ) ;
if ( localuserId == null || "" . equals ( localuserId) ) {
if ( sysUser != null ) {
field. setAccessible ( true ) ;
field. set ( parameter, sysUser. getId ( ) ) ;
field. setAccessible ( false ) ;
}
}
}
if ( "createTime" . equals ( field. getName ( ) ) ) {
field. setAccessible ( true ) ;
Object localCreateDate = field. get ( parameter) ;
field. setAccessible ( false ) ;
if ( localCreateDate == null || "" . equals ( localCreateDate) ) {
field. setAccessible ( true ) ;
field. set ( parameter, new Date ( ) ) ;
field. setAccessible ( false ) ;
}
}
if ( "sysOrgCode" . equals ( field. getName ( ) ) ) {
field. setAccessible ( true ) ;
Object localSysOrgCode = field. get ( parameter) ;
field. setAccessible ( false ) ;
if ( localSysOrgCode == null || "" . equals ( localSysOrgCode) ) {
if ( sysUser != null ) {
field. setAccessible ( true ) ;
field. setAccessible ( false ) ;
}
}
}
} catch ( Exception e) {
}
}
}
if ( SqlCommandType . UPDATE == sqlCommandType) {
UserDetail sysUser = this . getLoginUser ( ) ;
Field [ ] fields = null ;
if ( parameter instanceof ParamMap ) {
ParamMap < ? > p = ( ParamMap < ? > ) parameter;
String et = "et" ;
if ( p. containsKey ( et) ) {
parameter = p. get ( et) ;
} else {
parameter = p. get ( "param1" ) ;
}
if ( parameter == null ) {
return invocation. proceed ( ) ;
}
fields = oConvertUtils. getAllFields ( parameter) ;
} else {
fields = oConvertUtils. getAllFields ( parameter) ;
}
for ( Field field : fields) {
log. debug ( "------field.name------" + field. getName ( ) ) ;
try {
if ( "updateBy" . equals ( field. getName ( ) ) ) {
if ( sysUser != null ) {
field. setAccessible ( true ) ;
field. set ( parameter, sysUser. getUsername ( ) ) ;
field. setAccessible ( false ) ;
}
}
if ( "updateTime" . equals ( field. getName ( ) ) ) {
field. setAccessible ( true ) ;
field. set ( parameter, new Date ( ) ) ;
field. setAccessible ( false ) ;
}
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
}
return invocation. proceed ( ) ;
}
@Override
public Object plugin ( Object target) {
return Plugin . wrap ( target, this ) ;
}
@Override
public void setProperties ( Properties properties) {
}
private UserDetail getLoginUser ( ) {
UserDetail sysUser = null ;
try {
sysUser = SecurityUser . getUser ( ) ;
} catch ( Exception e) {
sysUser = null ;
}
return sysUser;
}
}
2
package com. hdx. contractor. util. query ;
public interface CommonConstant {
String UNKNOWN = "unknown" ;
String STRING_NULL = "null" ;
String DICT_TEXT_SUFFIX = "_dictText" ;
}
3
package com. hdx. contractor. util. query ;
import com. baomidou. mybatisplus. annotation. DbType ;
import com. hdx. contractor. util. SpringContextUtils ;
import lombok. extern. slf4j. Slf4j ;
import javax. sql. DataSource ;
import java. sql. Connection ;
import java. sql. DatabaseMetaData ;
import java. sql. SQLException ;
@Slf4j
public class CommonUtils {
private static String FILE_NAME_REGEX = "[^A-Za-z\\.\\(\\)\\-()\\_0-9\\u4e00-\\u9fa5]" ;
private static String DB_TYPE = "" ;
private static DbType dbTypeEnum = null ;
@Deprecated
public static String getDatabaseType ( ) {
if ( oConvertUtils. isNotEmpty ( DB_TYPE) ) {
return DB_TYPE;
}
DataSource dataSource = SpringContextUtils . getApplicationContext ( ) . getBean ( DataSource . class ) ;
try {
return getDatabaseTypeByDataSource ( dataSource) ;
} catch ( SQLException e) {
log. warn ( e. getMessage ( ) , e) ;
return "" ;
}
}
private static String getDatabaseTypeByDataSource ( DataSource dataSource) throws SQLException {
if ( "" . equals ( DB_TYPE) ) {
Connection connection = dataSource. getConnection ( ) ;
try {
DatabaseMetaData md = connection. getMetaData ( ) ;
String dbType = md. getDatabaseProductName ( ) . toUpperCase ( ) ;
String sqlserver = "SQL SERVER" ;
if ( dbType. indexOf ( DataBaseConstant . DB_TYPE_MYSQL) >= 0 ) {
DB_TYPE = DataBaseConstant . DB_TYPE_MYSQL;
} else if ( dbType. indexOf ( DataBaseConstant . DB_TYPE_ORACLE) >= 0 || dbType. indexOf ( DataBaseConstant . DB_TYPE_DM) >= 0 ) {
DB_TYPE = DataBaseConstant . DB_TYPE_ORACLE;
} else if ( dbType. indexOf ( DataBaseConstant . DB_TYPE_SQLSERVER) >= 0 || dbType. indexOf ( sqlserver) >= 0 ) {
DB_TYPE = DataBaseConstant . DB_TYPE_SQLSERVER;
} else if ( dbType. indexOf ( DataBaseConstant . DB_TYPE_POSTGRESQL) >= 0 ) {
DB_TYPE = DataBaseConstant . DB_TYPE_POSTGRESQL;
} else if ( dbType. indexOf ( DataBaseConstant . DB_TYPE_MARIADB) >= 0 ) {
DB_TYPE = DataBaseConstant . DB_TYPE_MARIADB;
} else {
log. error ( "数据库类型:[" + dbType + "]不识别!" ) ;
}
} catch ( Exception e) {
log. error ( e. getMessage ( ) , e) ;
} finally {
connection. close ( ) ;
}
}
return DB_TYPE;
}
}
4
package com. hdx. contractor. util. query ;
import com. hdx. contractor. util. SpringContextUtils ;
import java. util. List ;
public class DataAutorUtils {
public static final String MENU_DATA_AUTHOR_RULES = "MENU_DATA_AUTHOR_RULES" ;
@SuppressWarnings ( "unchecked" )
public static synchronized List < SysPermissionDataRuleModel > loadDataSearchConditon ( ) {
return ( List < SysPermissionDataRuleModel > ) SpringContextUtils . getHttpServletRequest ( ) . getAttribute ( MENU_DATA_AUTHOR_RULES) ;
}
}
5
package com. hdx. contractor. util. query ;
public interface DataBaseConstant {
public static final String DB_TYPE_MYSQL = "MYSQL" ;
public static final String DB_TYPE_ORACLE = "ORACLE" ;
public static final String DB_TYPE_DM = "DM" ;
public static final String DB_TYPE_POSTGRESQL = "POSTGRESQL" ;
public static final String DB_TYPE_SQLSERVER = "SQLSERVER" ;
public static final String DB_TYPE_MARIADB = "MARIADB" ;
public static final String DB_TYPE_DB2 = "DB2" ;
public static final String DB_TYPE_HSQL = "HSQL" ;
public static final String SYS_ORG_CODE = "sysOrgCode" ;
public static final String SYS_ORG_CODE_TABLE = "sys_org_code" ;
public static final String SYS_MULTI_ORG_CODE = "sysMultiOrgCode" ;
public static final String SYS_MULTI_ORG_CODE_TABLE = "sys_multi_org_code" ;
public static final String SYS_USER_CODE = "sysUserCode" ;
public static final String SYS_USER_CODE_TABLE = "sys_user_code" ;
public static final String SYS_USER_NAME = "sysUserName" ;
public static final String SYS_USER_NAME_TABLE = "sys_user_name" ;
public static final String SYS_DATE = "sysDate" ;
public static final String SYS_DATE_TABLE = "sys_date" ;
public static final String SYS_TIME = "sysTime" ;
public static final String SYS_TIME_TABLE = "sys_time" ;
public static final String SYS_BASE_PATH = "sys_base_path" ;
public static final String CREATE_BY_TABLE = "create_by" ;
public static final String CREATE_BY = "createBy" ;
public static final String CREATE_TIME_TABLE = "create_time" ;
public static final String CREATE_TIME = "createTime" ;
public static final String UPDATE_BY_TABLE = "update_by" ;
public static final String UPDATE_BY = "updateBy" ;
public static final String UPDATE_TIME = "updateTime" ;
public static final String UPDATE_TIME_TABLE = "update_time" ;
public static final String BPM_STATUS = "bpmStatus" ;
public static final String BPM_STATUS_TABLE = "bpm_status" ;
String TENANT_ID = "tenantId" ;
String TENANT_ID_TABLE = "tenant_id" ;
String SQL_WHERE = "where" ;
String SQL_ASC = "asc" ;
String DB_TYPE_SQL_SERVER_BLANK = "sql server" ;
}
6
package com. hdx. contractor. util. query ;
public enum MatchTypeEnum {
AND ( "AND" ) ,
OR ( "OR" ) ;
private String value;
MatchTypeEnum ( String value) {
this . value = value;
}
public String getValue ( ) {
return value;
}
public static MatchTypeEnum getByValue ( Object value) {
if ( oConvertUtils. isEmpty ( value) ) {
return null ;
}
return getByValue ( value. toString ( ) ) ;
}
public static MatchTypeEnum getByValue ( String value) {
if ( oConvertUtils. isEmpty ( value) ) {
return null ;
}
for ( MatchTypeEnum val : values ( ) ) {
if ( val. getValue ( ) . toLowerCase ( ) . equals ( value. toLowerCase ( ) ) ) {
return val;
}
}
return null ;
}
}
7
package com. hdx. contractor. util. query ;
import lombok. extern. slf4j. Slf4j ;
import org. springframework. beans. BeanUtils ;
import javax. servlet. http. HttpServletRequest ;
import java. io. UnsupportedEncodingException ;
import java. lang. reflect. Field ;
import java. math. BigDecimal ;
import java. math. BigInteger ;
import java. net. InetAddress ;
import java. net. NetworkInterface ;
import java. net. SocketException ;
import java. net. UnknownHostException ;
import java. sql. Date ;
import java. util. * ;
import java. util. regex. Matcher ;
import java. util. regex. Pattern ;
@Slf4j
public class oConvertUtils {
public static boolean isEmpty ( Object object) {
if ( object == null ) {
return ( true ) ;
}
if ( "" . equals ( object) ) {
return ( true ) ;
}
if ( CommonConstant . STRING_NULL. equals ( object) ) {
return ( true ) ;
}
return ( false ) ;
}
public static boolean isNotEmpty ( Object object) {
if ( object != null && ! "" . equals ( object) && ! object. equals ( CommonConstant . STRING_NULL) ) {
return ( true ) ;
}
return ( false ) ;
}
public static String decode ( String strIn, String sourceCode, String targetCode) {
String temp = code2code ( strIn, sourceCode, targetCode) ;
return temp;
}
@SuppressWarnings ( "AlibabaLowerCamelCaseVariableNaming" )
public static String StrToUTF ( String strIn, String sourceCode, String targetCode) {
strIn = "" ;
try {
strIn = new String ( strIn. getBytes ( "ISO-8859-1" ) , "GBK" ) ;
} catch ( UnsupportedEncodingException e) {
e. printStackTrace ( ) ;
}
return strIn;
}
private static String code2code ( String strIn, String sourceCode, String targetCode) {
String strOut = null ;
if ( strIn == null || "" . equals ( strIn. trim ( ) ) ) {
return strIn;
}
try {
byte [ ] b = strIn. getBytes ( sourceCode) ;
for ( int i = 0 ; i < b. length; i++ ) {
System . out. print ( b[ i] + " " ) ;
}
strOut = new String ( b, targetCode) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
return null ;
}
return strOut;
}
public static int getInt ( String s, int defval) {
if ( s == null || s == "" ) {
return ( defval) ;
}
try {
return ( Integer . parseInt ( s) ) ;
} catch ( NumberFormatException e) {
return ( defval) ;
}
}
public static int getInt ( String s) {
if ( s == null || s == "" ) {
return 0 ;
}
try {
return ( Integer . parseInt ( s) ) ;
} catch ( NumberFormatException e) {
return 0 ;
}
}
public static int getInt ( String s, Integer df) {
if ( s == null || s == "" ) {
return df;
}
try {
return ( Integer . parseInt ( s) ) ;
} catch ( NumberFormatException e) {
return 0 ;
}
}
public static Integer [ ] getInts ( String [ ] s) {
if ( s == null ) {
return null ;
}
Integer [ ] integer = new Integer [ s. length] ;
for ( int i = 0 ; i < s. length; i++ ) {
integer[ i] = Integer . parseInt ( s[ i] ) ;
}
return integer;
}
public static double getDouble ( String s, double defval) {
if ( s == null || s == "" ) {
return ( defval) ;
}
try {
return ( Double . parseDouble ( s) ) ;
} catch ( NumberFormatException e) {
return ( defval) ;
}
}
public static double getDou ( Double s, double defval) {
if ( s == null ) {
return ( defval) ;
}
return s;
}
public static int getInt ( Object object, int defval) {
if ( isEmpty ( object) ) {
return ( defval) ;
}
try {
return ( Integer . parseInt ( object. toString ( ) ) ) ;
} catch ( NumberFormatException e) {
return ( defval) ;
}
}
public static Integer getInt ( Object object) {
if ( isEmpty ( object) ) {
return null ;
}
try {
return ( Integer . parseInt ( object. toString ( ) ) ) ;
} catch ( NumberFormatException e) {
return null ;
}
}
public static int getInt ( BigDecimal s, int defval) {
if ( s == null ) {
return ( defval) ;
}
return s. intValue ( ) ;
}
public static Integer [ ] getIntegerArry ( String [ ] object) {
int len = object. length;
Integer [ ] result = new Integer [ len] ;
try {
for ( int i = 0 ; i < len; i++ ) {
result[ i] = new Integer ( object[ i] . trim ( ) ) ;
}
return result;
} catch ( NumberFormatException e) {
return null ;
}
}
public static String getString ( String s) {
return ( getString ( s, "" ) ) ;
}
public static String getString ( Object object) {
if ( isEmpty ( object) ) {
return "" ;
}
return ( object. toString ( ) . trim ( ) ) ;
}
public static String getString ( int i) {
return ( String . valueOf ( i) ) ;
}
public static String getString ( float i) {
return ( String . valueOf ( i) ) ;
}
public static String getString ( String s, String defval) {
if ( isEmpty ( s) ) {
return ( defval) ;
}
return ( s. trim ( ) ) ;
}
public static String getString ( Object s, String defval) {
if ( isEmpty ( s) ) {
return ( defval) ;
}
return ( s. toString ( ) . trim ( ) ) ;
}
public static long stringToLong ( String str) {
Long test = new Long ( 0 ) ;
try {
test = Long . valueOf ( str) ;
} catch ( Exception e) {
}
return test. longValue ( ) ;
}
public static String getIp ( ) {
String ip = null ;
try {
InetAddress address = InetAddress . getLocalHost ( ) ;
ip = address. getHostAddress ( ) ;
} catch ( UnknownHostException e) {
e. printStackTrace ( ) ;
}
return ip;
}
private static boolean isBaseDataType ( Class clazz) throws Exception {
return ( clazz. equals ( String . class ) || clazz. equals ( Integer . class ) || clazz. equals ( Byte . class ) || clazz. equals ( Long . class ) || clazz. equals ( Double . class ) || clazz. equals ( Float . class ) || clazz. equals ( Character . class ) || clazz. equals ( Short . class ) || clazz. equals ( BigDecimal . class ) || clazz. equals ( BigInteger . class ) || clazz. equals ( Boolean . class ) || clazz. equals ( Date . class ) || clazz. isPrimitive ( ) ) ;
}
public static String getIpAddrByRequest ( HttpServletRequest request) {
String ip = request. getHeader ( "x-forwarded-for" ) ;
if ( ip == null || ip. length ( ) == 0 || CommonConstant . UNKNOWN. equalsIgnoreCase ( ip) ) {
ip = request. getHeader ( "Proxy-Client-IP" ) ;
}
if ( ip == null || ip. length ( ) == 0 || CommonConstant . UNKNOWN. equalsIgnoreCase ( ip) ) {
ip = request. getHeader ( "WL-Proxy-Client-IP" ) ;
}
if ( ip == null || ip. length ( ) == 0 || CommonConstant . UNKNOWN. equalsIgnoreCase ( ip) ) {
ip = request. getRemoteAddr ( ) ;
}
return ip;
}
public static String getRealIp ( ) throws SocketException {
String localip = null ;
String netip = null ;
Enumeration < NetworkInterface > netInterfaces = NetworkInterface . getNetworkInterfaces ( ) ;
InetAddress ip = null ;
boolean finded = false ;
while ( netInterfaces. hasMoreElements ( ) && ! finded) {
NetworkInterface ni = netInterfaces. nextElement ( ) ;
Enumeration < InetAddress > address = ni. getInetAddresses ( ) ;
while ( address. hasMoreElements ( ) ) {
ip = address. nextElement ( ) ;
if ( ! ip. isSiteLocalAddress ( ) && ! ip. isLoopbackAddress ( ) && ip. getHostAddress ( ) . indexOf ( ":" ) == - 1 ) {
netip = ip. getHostAddress ( ) ;
finded = true ;
break ;
} else if ( ip. isSiteLocalAddress ( ) && ! ip. isLoopbackAddress ( ) && ip. getHostAddress ( ) . indexOf ( ":" ) == - 1 ) {
localip = ip. getHostAddress ( ) ;
}
}
}
if ( netip != null && ! "" . equals ( netip) ) {
return netip;
} else {
return localip;
}
}
public static String replaceBlank ( String str) {
String dest = "" ;
if ( str != null ) {
String reg = "\\s*|\t|\r|\n" ;
Pattern p = Pattern . compile ( reg) ;
Matcher m = p. matcher ( str) ;
dest = m. replaceAll ( "" ) ;
}
return dest;
}
public static boolean isIn ( String substring, String [ ] source) {
if ( source == null || source. length == 0 ) {
return false ;
}
for ( int i = 0 ; i < source. length; i++ ) {
String aSource = source[ i] ;
if ( aSource. equals ( substring) ) {
return true ;
}
}
return false ;
}
public static Map < Object , Object > getHashMap ( ) {
return new HashMap < > ( 5 ) ;
}
public static Map < Object , Object > setToMap ( Set < Object > setobj) {
Map < Object , Object > map = getHashMap ( ) ;
for ( Iterator iterator = setobj. iterator ( ) ; iterator. hasNext ( ) ; ) {
Map. Entry < Object , Object > entry = ( Map. Entry < Object , Object > ) iterator. next ( ) ;
map. put ( entry. getKey ( ) . toString ( ) , entry. getValue ( ) == null ? "" : entry. getValue ( ) . toString ( ) . trim ( ) ) ;
}
return map;
}
public static boolean isInnerIp ( String ipAddress) {
boolean isInnerIp = false ;
long ipNum = getIpNum ( ipAddress) ;
long aBegin = getIpNum ( "10.0.0.0" ) ;
long aEnd = getIpNum ( "10.255.255.255" ) ;
long bBegin = getIpNum ( "172.16.0.0" ) ;
long bEnd = getIpNum ( "172.31.255.255" ) ;
long cBegin = getIpNum ( "192.168.0.0" ) ;
long cEnd = getIpNum ( "192.168.255.255" ) ;
String localIp = "127.0.0.1" ;
isInnerIp = isInner ( ipNum, aBegin, aEnd) || isInner ( ipNum, bBegin, bEnd) || isInner ( ipNum, cBegin, cEnd) || localIp. equals ( ipAddress) ;
return isInnerIp;
}
private static long getIpNum ( String ipAddress) {
String [ ] ip = ipAddress. split ( "\\." ) ;
long a = Integer . parseInt ( ip[ 0 ] ) ;
long b = Integer . parseInt ( ip[ 1 ] ) ;
long c = Integer . parseInt ( ip[ 2 ] ) ;
long d = Integer . parseInt ( ip[ 3 ] ) ;
long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
return ipNum;
}
private static boolean isInner ( long userIp, long begin, long end) {
return ( userIp >= begin) && ( userIp <= end) ;
}
public static String camelName ( String name) {
StringBuilder result = new StringBuilder ( ) ;
if ( name == null || name. isEmpty ( ) ) {
return "" ;
} else if ( ! name. contains ( SymbolConstant . UNDERLINE) ) {
return name. substring ( 0 , 1 ) . toLowerCase ( ) + name. substring ( 1 ) . toLowerCase ( ) ;
}
String [ ] camels = name. split ( "_" ) ;
for ( String camel : camels) {
if ( camel. isEmpty ( ) ) {
continue ;
}
if ( result. length ( ) == 0 ) {
result. append ( camel. toLowerCase ( ) ) ;
} else {
result. append ( camel. substring ( 0 , 1 ) . toUpperCase ( ) ) ;
result. append ( camel. substring ( 1 ) . toLowerCase ( ) ) ;
}
}
return result. toString ( ) ;
}
public static String camelNames ( String names) {
if ( names== null || "" . equals ( names) ) {
return null ;
}
StringBuffer sf = new StringBuffer ( ) ;
String [ ] fs = names. split ( "," ) ;
for ( String field : fs) {
field = camelName ( field) ;
sf. append ( field + "," ) ;
}
String result = sf. toString ( ) ;
return result. substring ( 0 , result. length ( ) - 1 ) ;
}
public static String camelNameCapFirst ( String name) {
StringBuilder result = new StringBuilder ( ) ;
if ( name == null || name. isEmpty ( ) ) {
return "" ;
} else if ( ! name. contains ( SymbolConstant . UNDERLINE) ) {
return name. substring ( 0 , 1 ) . toUpperCase ( ) + name. substring ( 1 ) . toLowerCase ( ) ;
}
String [ ] camels = name. split ( "_" ) ;
for ( String camel : camels) {
if ( camel. isEmpty ( ) ) {
continue ;
}
result. append ( camel. substring ( 0 , 1 ) . toUpperCase ( ) ) ;
result. append ( camel. substring ( 1 ) . toLowerCase ( ) ) ;
}
return result. toString ( ) ;
}
public static String camelToUnderline ( String para) {
int length = 3 ;
if ( para. length ( ) < length) {
return para. toLowerCase ( ) ;
}
StringBuilder sb= new StringBuilder ( para) ;
int temp= 0 ;
for ( int i= 2 ; i< para. length ( ) ; i++ ) {
if ( Character . isUpperCase ( para. charAt ( i) ) ) {
sb. insert ( i+ temp, "_" ) ;
temp+= 1 ;
}
}
return sb. toString ( ) . toLowerCase ( ) ;
}
public static String randomGen ( int place) {
String base = "qwertyuioplkjhgfdsazxcvbnmQAZWSXEDCRFVTGBYHNUJMIKLOP0123456789" ;
StringBuffer sb = new StringBuffer ( ) ;
Random rd = new Random ( ) ;
for ( int i= 0 ; i< place; i++ ) {
sb. append ( base. charAt ( rd. nextInt ( base. length ( ) ) ) ) ;
}
return sb. toString ( ) ;
}
public static Field [ ] getAllFields ( Object object) {
Class < ? > clazz = object. getClass ( ) ;
List < Field > fieldList = new ArrayList < > ( ) ;
while ( clazz != null ) {
fieldList. addAll ( new ArrayList < > ( Arrays . asList ( clazz. getDeclaredFields ( ) ) ) ) ;
clazz = clazz. getSuperclass ( ) ;
}
Field [ ] fields = new Field [ fieldList. size ( ) ] ;
fieldList. toArray ( fields) ;
return fields;
}
public static List < Map < String , Object > > toLowerCasePageList ( List < Map < String , Object > > list) {
List < Map < String , Object > > select = new ArrayList < > ( ) ;
for ( Map < String , Object > row : list) {
Map < String , Object > resultMap = new HashMap < > ( 5 ) ;
Set < String > keySet = row. keySet ( ) ;
for ( String key : keySet) {
String newKey = key. toLowerCase ( ) ;
resultMap. put ( newKey, row. get ( key) ) ;
}
select. add ( resultMap) ;
}
return select;
}
public static < F , T > List < T > entityListToModelList ( List < F > fromList, Class < T > tClass) {
if ( fromList == null || fromList. isEmpty ( ) ) {
return null ;
}
List < T > tList = new ArrayList < > ( ) ;
for ( F f : fromList) {
T t = entityToModel ( f, tClass) ;
tList. add ( t) ;
}
return tList;
}
public static < F , T > T entityToModel ( F entity, Class < T > modelClass) {
log. debug ( "entityToModel : Entity属性的值赋值到Model" ) ;
Object model = null ;
if ( entity == null || modelClass == null ) {
return null ;
}
try {
model = modelClass. newInstance ( ) ;
} catch ( InstantiationException e) {
log. error ( "entityToModel : 实例化异常" , e) ;
} catch ( IllegalAccessException e) {
log. error ( "entityToModel : 安全权限异常" , e) ;
}
BeanUtils . copyProperties ( entity, model) ;
return ( T ) model;
}
public static boolean listIsEmpty ( Collection list) {
return ( list == null || list. size ( ) == 0 ) ;
}
public static boolean listIsNotEmpty ( Collection list) {
return ! listIsEmpty ( list) ;
}
}
8
package com. hdx. contractor. util. query ;
import java. io. Serializable ;
public class QueryCondition implements Serializable {
private static final long serialVersionUID = 4740166316629191651L ;
private String field;
private String type;
private String dbType;
private String rule;
private String val;
public String getField ( ) {
return field;
}
public void setField ( String field) {
this . field = field;
}
public String getType ( ) {
return type;
}
public void setType ( String type) {
this . type = type;
}
public String getDbType ( ) {
return dbType;
}
public void setDbType ( String dbType) {
this . dbType = dbType;
}
public String getRule ( ) {
return rule;
}
public void setRule ( String rule) {
this . rule = rule;
}
public String getVal ( ) {
return val;
}
public void setVal ( String val) {
this . val = val;
}
@Override
public String toString ( ) {
StringBuffer sb = new StringBuffer ( ) ;
if ( field == null || "" . equals ( field) ) {
return "" ;
}
sb. append ( this . field) . append ( " " ) . append ( this . rule) . append ( " " ) . append ( this . type) . append ( " " ) . append ( this . dbType) . append ( " " ) . append ( this . val) ;
return sb. toString ( ) ;
}
}
9
package com. hdx. contractor. util. query ;
import com. alibaba. fastjson. JSON;
import com. baomidou. mybatisplus. annotation. TableField ;
import com. baomidou. mybatisplus. core. conditions. query. QueryWrapper ;
import lombok. extern. slf4j. Slf4j ;
import org. apache. commons. beanutils. PropertyUtils ;
import org. springframework. util. NumberUtils ;
import java. beans. PropertyDescriptor ;
import java. io. UnsupportedEncodingException ;
import java. lang. reflect. Field ;
import java. math. BigDecimal ;
import java. net. URLDecoder ;
import java. text. ParseException ;
import java. text. SimpleDateFormat ;
import java. util. * ;
import java. util. regex. Matcher ;
import java. util. regex. Pattern ;
import java. util. stream. Collectors ;
@Slf4j
public class QueryGenerator {
public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN" ;
private static final String BEGIN = "_begin" ;
private static final String END = "_end" ;
private static final String MULTI = "_MultiString" ;
private static final String STAR = "*" ;
private static final String COMMA = "," ;
public static final String QUERY_COMMA_ESCAPE = "++" ;
private static final String NOT_EQUAL = "!" ;
private static final String QUERY_SEPARATE_KEYWORD = " " ;
private static final String SUPER_QUERY_PARAMS = "superQueryParams" ;
private static final String SUPER_QUERY_MATCH_TYPE = "superQueryMatchType" ;
public static final String SQL_SQ = "'" ;
private static final String ORDER_COLUMN = "column" ;
private static final String ORDER_TYPE = "order" ;
private static final String ORDER_TYPE_ASC = "ASC" ;
public static final String LIKE_MYSQL_SPECIAL_STRS = "_,%" ;
public static final String YYYY_MM_DD = "yyyy-MM-dd" ;
public static final String TO_DATE = "to_date" ;
private static final ThreadLocal < SimpleDateFormat > LOCAL = new ThreadLocal < SimpleDateFormat > ( ) ;
private static SimpleDateFormat getTime ( ) {
SimpleDateFormat time = LOCAL. get ( ) ;
if ( time == null ) {
time = new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss" ) ;
LOCAL. set ( time) ;
}
return time;
}
public static < T > QueryWrapper < T > initQueryWrapper ( T searchObj, Map < String , String [ ] > parameterMap) {
long start = System . currentTimeMillis ( ) ;
QueryWrapper < T > queryWrapper = new QueryWrapper < T > ( ) ;
installMplus ( queryWrapper, searchObj, parameterMap) ;
log. debug ( "---查询条件构造器初始化完成,耗时:" + ( System . currentTimeMillis ( ) - start) + "毫秒----" ) ;
return queryWrapper;
}
private static void installMplus ( QueryWrapper < ? > queryWrapper, Object searchObj, Map < String , String [ ] > parameterMap) {
PropertyDescriptor [ ] origDescriptors = PropertyUtils . getPropertyDescriptors ( searchObj) ;
Map < String , SysPermissionDataRuleModel > ruleMap = getRuleMap ( ) ;
for ( String c : ruleMap. keySet ( ) ) {
if ( oConvertUtils. isNotEmpty ( c) && c. startsWith ( SQL_RULES_COLUMN) ) {
queryWrapper. and ( i -> i. apply ( getSqlRuleValue ( ruleMap. get ( c) . getRuleValue ( ) ) ) ) ;
}
}
String name, type, column;
Map < String , String > fieldColumnMap = new HashMap < > ( 5 ) ;
for ( int i = 0 ; i < origDescriptors. length; i++ ) {
name = origDescriptors[ i] . getName ( ) ;
type = origDescriptors[ i] . getPropertyType ( ) . toString ( ) ;
try {
if ( judgedIsUselessField ( name) || ! PropertyUtils . isReadable ( searchObj, name) ) {
continue ;
}
Object value = PropertyUtils . getSimpleProperty ( searchObj, name) ;
column = getTableFieldName ( searchObj. getClass ( ) , name) ;
if ( column == null ) {
continue ;
}
fieldColumnMap. put ( name, column) ;
if ( ruleMap. containsKey ( name) ) {
addRuleToQueryWrapper ( ruleMap. get ( name) , column, origDescriptors[ i] . getPropertyType ( ) , queryWrapper) ;
}
doIntervalQuery ( queryWrapper, parameterMap, type, name, column) ;
if ( null != value && value. toString ( ) . startsWith ( COMMA) && value. toString ( ) . endsWith ( COMMA) ) {
String multiLikeval = value. toString ( ) . replace ( ",," , COMMA) ;
String [ ] vals = multiLikeval. substring ( 1 , multiLikeval. length ( ) ) . split ( COMMA) ;
final String field = oConvertUtils. camelToUnderline ( column) ;
if ( vals. length > 1 ) {
queryWrapper. and ( j -> {
log. info ( "---查询过滤器,Query规则---field:{}, rule:{}, value:{}" , field, "like" , vals[ 0 ] ) ;
j = j. like ( field, vals[ 0 ] ) ;
for ( int k = 1 ; k < vals. length; k++ ) {
j = j. or ( ) . like ( field, vals[ k] ) ;
log. info ( "---查询过滤器,Query规则 .or()---field:{}, rule:{}, value:{}" , field, "like" , vals[ k] ) ;
}
} ) ;
} else {
log. info ( "---查询过滤器,Query规则---field:{}, rule:{}, value:{}" , field, "like" , vals[ 0 ] ) ;
queryWrapper. and ( j -> j. like ( field, vals[ 0 ] ) ) ;
}
} else {
QueryRuleEnum rule = convert2Rule ( value) ;
value = replaceValue ( rule, value) ;
addEasyQuery ( queryWrapper, column, rule, value) ;
}
} catch ( Exception e) {
log. error ( e. getMessage ( ) , e) ;
}
}
doMultiFieldsOrder ( queryWrapper, parameterMap, fieldColumnMap) ;
doSuperQuery ( queryWrapper, parameterMap, fieldColumnMap) ;
}
private static void doIntervalQuery ( QueryWrapper < ? > queryWrapper, Map < String , String [ ] > parameterMap, String type, String filedName, String columnName) throws ParseException {
String endValue = null , beginValue = null ;
if ( parameterMap != null && parameterMap. containsKey ( filedName + BEGIN) ) {
beginValue = parameterMap. get ( filedName + BEGIN) [ 0 ] . trim ( ) ;
addQueryByRule ( queryWrapper, columnName, type, beginValue, QueryRuleEnum . GE) ;
}
if ( parameterMap != null && parameterMap. containsKey ( filedName + END) ) {
endValue = parameterMap. get ( filedName + END) [ 0 ] . trim ( ) ;
addQueryByRule ( queryWrapper, columnName, type, endValue, QueryRuleEnum . LE) ;
}
if ( parameterMap != null && parameterMap. containsKey ( filedName + MULTI) ) {
endValue = parameterMap. get ( filedName + MULTI) [ 0 ] . trim ( ) ;
addQueryByRule ( queryWrapper, columnName. replace ( MULTI, "" ) , type, endValue, QueryRuleEnum . IN) ;
}
}
private static void doMultiFieldsOrder ( QueryWrapper < ? > queryWrapper, Map < String , String [ ] > parameterMap, Map < String , String > fieldColumnMap) {
Set < String > allFields = fieldColumnMap. keySet ( ) ;
String column = null , order = null ;
if ( parameterMap != null && parameterMap. containsKey ( ORDER_COLUMN) ) {
column = parameterMap. get ( ORDER_COLUMN) [ 0 ] ;
}
if ( parameterMap != null && parameterMap. containsKey ( ORDER_TYPE) ) {
order = parameterMap. get ( ORDER_TYPE) [ 0 ] ;
}
log. info ( "排序规则>>列:" + column + ",排序方式:" + order) ;
if ( DataBaseConstant . CREATE_TIME. equals ( column) && ! fieldColumnMap. containsKey ( DataBaseConstant . CREATE_TIME) ) {
column = "id" ;
log. warn ( "检测到实体里没有字段createTime,改成采用ID排序!" ) ;
}
if ( oConvertUtils. isNotEmpty ( column) && oConvertUtils. isNotEmpty ( order) ) {
if ( column. endsWith ( CommonConstant . DICT_TEXT_SUFFIX) ) {
column = column. substring ( 0 , column. lastIndexOf ( CommonConstant . DICT_TEXT_SUFFIX) ) ;
}
log. debug ( "当前字段有:" + allFields) ;
if ( ! allColumnExist ( column, allFields) ) {
throw new RuntimeException ( "请注意,将要排序的列字段不存在:" + column) ;
}
if ( column. contains ( "," ) ) {
List < String > columnList = Arrays . asList ( column. split ( "," ) ) ;
String columnStrNew = columnList. stream ( ) . map ( c -> fieldColumnMap. get ( c) ) . collect ( Collectors . joining ( "," ) ) ;
if ( oConvertUtils. isNotEmpty ( columnStrNew) ) {
column = columnStrNew;
}
} else {
column = fieldColumnMap. get ( column) ;
}
SqlInjectionUtil . filterContent ( column) ;
if ( order. toUpperCase ( ) . indexOf ( ORDER_TYPE_ASC) >= 0 ) {
String columnStr = oConvertUtils. camelToUnderline ( column) ;
String [ ] columnArray = columnStr. split ( "," ) ;
queryWrapper. orderByAsc ( Arrays . asList ( columnArray) ) ;
} else {
String columnStr = oConvertUtils. camelToUnderline ( column) ;
String [ ] columnArray = columnStr. split ( "," ) ;
queryWrapper. orderByDesc ( Arrays . asList ( columnArray) ) ;
}
}
}
private static boolean allColumnExist ( String columnStr, Set < String > allFields) {
boolean exist = true ;
if ( columnStr. indexOf ( COMMA) >= 0 ) {
String [ ] arr = columnStr. split ( COMMA) ;
for ( String column : arr) {
if ( ! allFields. contains ( column) ) {
exist = false ;
break ;
}
}
} else {
exist = allFields. contains ( columnStr) ;
}
return exist;
}
private static void doSuperQuery ( QueryWrapper < ? > queryWrapper, Map < String , String [ ] > parameterMap, Map < String , String > fieldColumnMap) {
if ( parameterMap != null && parameterMap. containsKey ( SUPER_QUERY_PARAMS) ) {
String superQueryParams = parameterMap. get ( SUPER_QUERY_PARAMS) [ 0 ] ;
String superQueryMatchType = parameterMap. get ( SUPER_QUERY_MATCH_TYPE) != null ? parameterMap. get ( SUPER_QUERY_MATCH_TYPE) [ 0 ] : MatchTypeEnum . AND. getValue ( ) ;
MatchTypeEnum matchType = MatchTypeEnum . getByValue ( superQueryMatchType) ;
try {
superQueryParams = URLDecoder . decode ( superQueryParams, "UTF-8" ) ;
List < QueryCondition > conditions = JSON. parseArray ( superQueryParams, QueryCondition . class ) ;
if ( conditions == null || conditions. size ( ) == 0 ) {
return ;
}
List < QueryCondition > filterConditions = conditions. stream ( ) . filter (
rule -> oConvertUtils. isNotEmpty ( rule. getField ( ) )
&& oConvertUtils. isNotEmpty ( rule. getRule ( ) )
&& oConvertUtils. isNotEmpty ( rule. getVal ( ) )
) . collect ( Collectors . toList ( ) ) ;
if ( filterConditions. size ( ) == 0 ) {
return ;
}
log. info ( "---高级查询参数-->" + filterConditions) ;
queryWrapper. and ( andWrapper -> {
for ( int i = 0 ; i < filterConditions. size ( ) ; i++ ) {
QueryCondition rule = filterConditions. get ( i) ;
if ( oConvertUtils. isNotEmpty ( rule. getField ( ) )
&& oConvertUtils. isNotEmpty ( rule. getRule ( ) )
&& oConvertUtils. isNotEmpty ( rule. getVal ( ) ) ) {
log. debug ( "SuperQuery ==> " + rule. toString ( ) ) ;
Object queryValue = rule. getVal ( ) ;
if ( "date" . equals ( rule. getType ( ) ) ) {
queryValue = str2Date ( rule. getVal ( ) , date_sdf. get ( ) ) ;
} else if ( "datetime" . equals ( rule. getType ( ) ) ) {
queryValue = str2Date ( rule. getVal ( ) , datetimeFormat. get ( ) ) ;
}
String dbType = rule. getDbType ( ) ;
if ( oConvertUtils. isNotEmpty ( dbType) ) {
try {
String valueStr = String . valueOf ( queryValue) ;
switch ( dbType. toLowerCase ( ) . trim ( ) ) {
case "int" :
queryValue = Integer . parseInt ( valueStr) ;
break ;
case "bigdecimal" :
queryValue = new BigDecimal ( valueStr) ;
break ;
case "short" :
queryValue = Short . parseShort ( valueStr) ;
break ;
case "long" :
queryValue = Long . parseLong ( valueStr) ;
break ;
case "float" :
queryValue = Float . parseFloat ( valueStr) ;
break ;
case "double" :
queryValue = Double . parseDouble ( valueStr) ;
break ;
case "boolean" :
queryValue = Boolean . parseBoolean ( valueStr) ;
break ;
default :
}
} catch ( Exception e) {
log. error ( "高级查询值转换失败:" , e) ;
}
}
addEasyQuery ( andWrapper, fieldColumnMap. get ( rule. getField ( ) ) , QueryRuleEnum . getByValue ( rule. getRule ( ) ) , queryValue) ;
if ( MatchTypeEnum . OR == matchType && i < ( filterConditions. size ( ) - 1 ) ) {
andWrapper. or ( ) ;
}
}
}
} ) ;
} catch ( UnsupportedEncodingException e) {
log. error ( "--高级查询参数转码失败:" + superQueryParams, e) ;
} catch ( Exception e) {
log. error ( "--高级查询拼接失败:" + e. getMessage ( ) ) ;
e. printStackTrace ( ) ;
}
}
}
public static QueryRuleEnum convert2Rule ( Object value) {
if ( value == null ) {
return QueryRuleEnum . EQ;
}
String val = ( value + "" ) . toString ( ) . trim ( ) ;
if ( val. length ( ) == 0 ) {
return QueryRuleEnum . EQ;
}
QueryRuleEnum rule = null ;
int length2 = 2 ;
int length3 = 3 ;
if ( rule == null && val. length ( ) >= length3) {
if ( QUERY_SEPARATE_KEYWORD. equals ( val. substring ( length2, length3) ) ) {
rule = QueryRuleEnum . getByValue ( val. substring ( 0 , 2 ) ) ;
}
}
if ( rule == null && val. length ( ) >= length2) {
if ( QUERY_SEPARATE_KEYWORD. equals ( val. substring ( 1 , length2) ) ) {
rule = QueryRuleEnum . getByValue ( val. substring ( 0 , 1 ) ) ;
}
}
if ( rule == null && val. equals ( STAR) ) {
rule = QueryRuleEnum . EQ;
}
if ( rule == null && val. contains ( STAR) ) {
if ( val. startsWith ( STAR) && val. endsWith ( STAR) ) {
rule = QueryRuleEnum . LIKE;
} else if ( val. startsWith ( STAR) ) {
rule = QueryRuleEnum . LEFT_LIKE;
} else if ( val. endsWith ( STAR) ) {
rule = QueryRuleEnum . RIGHT_LIKE;
}
}
if ( rule == null && val. contains ( COMMA) ) {
rule = QueryRuleEnum . IN;
}
if ( rule == null && val. startsWith ( NOT_EQUAL) ) {
rule = QueryRuleEnum . NE;
}
if ( rule == null && val. indexOf ( QUERY_COMMA_ESCAPE) > 0 ) {
rule = QueryRuleEnum . EQ_WITH_ADD;
}
if ( rule == QueryRuleEnum . IN && val. indexOf ( YYYY_MM_DD) >= 0 && val. indexOf ( TO_DATE) >= 0 ) {
rule = QueryRuleEnum . EQ;
}
return rule != null ? rule : QueryRuleEnum . EQ;
}
private static Object replaceValue ( QueryRuleEnum rule, Object value) {
if ( rule == null ) {
return null ;
}
if ( ! ( value instanceof String ) ) {
return value;
}
String val = ( value + "" ) . toString ( ) . trim ( ) ;
if ( QueryRuleEnum . EQ. getValue ( ) . equals ( val) ) {
return val;
}
if ( rule == QueryRuleEnum . LIKE) {
value = val. substring ( 1 , val. length ( ) - 1 ) ;
value = specialStrConvert ( value. toString ( ) ) ;
} else if ( rule == QueryRuleEnum . LEFT_LIKE || rule == QueryRuleEnum . NE) {
value = val. substring ( 1 ) ;
value = specialStrConvert ( value. toString ( ) ) ;
} else if ( rule == QueryRuleEnum . RIGHT_LIKE) {
value = val. substring ( 0 , val. length ( ) - 1 ) ;
value = specialStrConvert ( value. toString ( ) ) ;
} else if ( rule == QueryRuleEnum . IN) {
value = val. split ( "," ) ;
} else if ( rule == QueryRuleEnum . EQ_WITH_ADD) {
value = val. replaceAll ( "\\+\\+" , COMMA) ;
} else {
if ( val. startsWith ( rule. getValue ( ) ) ) {
value = val. replaceFirst ( rule. getValue ( ) , "" ) ;
} else if ( val. startsWith ( rule. getCondition ( ) + QUERY_SEPARATE_KEYWORD) ) {
value = val. replaceFirst ( rule. getCondition ( ) + QUERY_SEPARATE_KEYWORD, "" ) . trim ( ) ;
}
}
return value;
}
private static void addQueryByRule ( QueryWrapper < ? > queryWrapper, String name, String type, String value, QueryRuleEnum rule) throws ParseException {
if ( oConvertUtils. isNotEmpty ( value) ) {
if ( value. contains ( COMMA) ) {
Object [ ] temp = Arrays . stream ( value. split ( COMMA) ) . map ( v -> {
try {
return QueryGenerator . parseByType ( v, type, rule) ;
} catch ( ParseException e) {
e. printStackTrace ( ) ;
return v;
}
} ) . toArray ( ) ;
addEasyQuery ( queryWrapper, name, rule, temp) ;
return ;
}
Object temp = QueryGenerator . parseByType ( value, type, rule) ;
addEasyQuery ( queryWrapper, name, rule, temp) ;
}
}
private static Object parseByType ( String value, String type, QueryRuleEnum rule) throws ParseException {
Object temp;
switch ( type) {
case "class java.lang.Integer" :
temp = Integer . parseInt ( value) ;
break ;
case "class java.math.BigDecimal" :
temp = new BigDecimal ( value) ;
break ;
case "class java.lang.Short" :
temp = Short . parseShort ( value) ;
break ;
case "class java.lang.Long" :
temp = Long . parseLong ( value) ;
break ;
case "class java.lang.Float" :
temp = Float . parseFloat ( value) ;
break ;
case "class java.lang.Double" :
temp = Double . parseDouble ( value) ;
break ;
case "class java.util.Date" :
temp = getDateQueryByRule ( value, rule) ;
break ;
default :
temp = value;
break ;
}
return temp;
}
private static Date getDateQueryByRule ( String value, QueryRuleEnum rule) throws ParseException {
Date date = null ;
int length = 10 ;
if ( value. length ( ) == length) {
if ( rule == QueryRuleEnum . GE) {
date = getTime ( ) . parse ( value + " 00:00:00" ) ;
} else if ( rule == QueryRuleEnum . LE) {
date = getTime ( ) . parse ( value + " 23:59:59" ) ;
}
}
if ( date == null ) {
date = getTime ( ) . parse ( value) ;
}
return date;
}
public static void addEasyQuery ( QueryWrapper < ? > queryWrapper, String name, QueryRuleEnum rule, Object value) {
if ( value == null || rule == null || oConvertUtils. isEmpty ( value) ) {
return ;
}
name = oConvertUtils. camelToUnderline ( name) ;
log. info ( "---查询过滤器,Query规则---field:{}, rule:{}, value:{}" , name, rule. getValue ( ) , value) ;
switch ( rule) {
case GT:
queryWrapper. gt ( name, value) ;
break ;
case GE:
queryWrapper. ge ( name, value) ;
break ;
case LT:
queryWrapper. lt ( name, value) ;
break ;
case LE:
queryWrapper. le ( name, value) ;
break ;
case EQ:
case EQ_WITH_ADD:
queryWrapper. eq ( name, value) ;
break ;
case NE:
queryWrapper. ne ( name, value) ;
break ;
case IN:
if ( value instanceof String ) {
queryWrapper. in ( name, ( Object [ ] ) value. toString ( ) . split ( COMMA) ) ;
} else if ( value instanceof String [ ] ) {
queryWrapper. in ( name, ( Object [ ] ) value) ;
}
else if ( value. getClass ( ) . isArray ( ) ) {
queryWrapper. in ( name, ( Object [ ] ) value) ;
} else {
queryWrapper. in ( name, value) ;
}
break ;
case LIKE:
queryWrapper. like ( name, value) ;
break ;
case LEFT_LIKE:
queryWrapper. likeLeft ( name, value) ;
break ;
case RIGHT_LIKE:
queryWrapper. likeRight ( name, value) ;
break ;
default :
log. info ( "--查询规则未匹配到---" ) ;
break ;
}
}
private static boolean judgedIsUselessField ( String name) {
return "class" . equals ( name) || "ids" . equals ( name)
|| "page" . equals ( name) || "rows" . equals ( name)
|| "sort" . equals ( name) || "order" . equals ( name) ;
}
public static Map < String , SysPermissionDataRuleModel > getRuleMap ( ) {
Map < String , SysPermissionDataRuleModel > ruleMap = new HashMap < > ( 5 ) ;
List < SysPermissionDataRuleModel > list = DataAutorUtils . loadDataSearchConditon ( ) ;
if ( list != null && list. size ( ) > 0 ) {
if ( list. get ( 0 ) == null ) {
return ruleMap;
}
for ( SysPermissionDataRuleModel rule : list) {
String column = rule. getRuleColumn ( ) ;
if ( QueryRuleEnum . SQL_RULES. getValue ( ) . equals ( rule. getRuleConditions ( ) ) ) {
column = SQL_RULES_COLUMN + rule. getId ( ) ;
}
ruleMap. put ( column, rule) ;
}
}
return ruleMap;
}
private static void addRuleToQueryWrapper ( SysPermissionDataRuleModel dataRule, String name, Class propertyType, QueryWrapper < ? > queryWrapper) {
QueryRuleEnum rule = QueryRuleEnum . getByValue ( dataRule. getRuleConditions ( ) ) ;
if ( rule. equals ( QueryRuleEnum . IN) && ! propertyType. equals ( String . class ) ) {
String [ ] values = dataRule. getRuleValue ( ) . split ( "," ) ;
Object [ ] objs = new Object [ values. length] ;
for ( int i = 0 ; i < values. length; i++ ) {
objs[ i] = NumberUtils . parseNumber ( values[ i] , propertyType) ;
}
addEasyQuery ( queryWrapper, name, rule, objs) ;
} else {
if ( propertyType. equals ( String . class ) ) {
addEasyQuery ( queryWrapper, name, rule, converRuleValue ( dataRule. getRuleValue ( ) ) ) ;
} else if ( propertyType. equals ( Date . class ) ) {
String dateStr = converRuleValue ( dataRule. getRuleValue ( ) ) ;
int length = 10 ;
if ( dateStr. length ( ) == length) {
addEasyQuery ( queryWrapper, name, rule, str2Date ( dateStr, date_sdf. get ( ) ) ) ;
} else {
addEasyQuery ( queryWrapper, name, rule, str2Date ( dateStr, datetimeFormat. get ( ) ) ) ;
}
} else {
addEasyQuery ( queryWrapper, name, rule, NumberUtils . parseNumber ( dataRule. getRuleValue ( ) , propertyType) ) ;
}
}
}
public static ThreadLocal < SimpleDateFormat > date_sdf = new ThreadLocal < SimpleDateFormat > ( ) {
@Override
protected SimpleDateFormat initialValue ( ) {
return new SimpleDateFormat ( "yyyy-MM-dd" ) ;
}
} ;
public static ThreadLocal < SimpleDateFormat > datetimeFormat = new ThreadLocal < SimpleDateFormat > ( ) {
@Override
protected SimpleDateFormat initialValue ( ) {
return new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss" ) ;
}
} ;
public static Date str2Date ( String str, SimpleDateFormat sdf) {
if ( null == str || "" . equals ( str) ) {
return null ;
}
Date date = null ;
try {
date = sdf. parse ( str) ;
return date;
} catch ( ParseException e) {
e. printStackTrace ( ) ;
}
return null ;
}
public static String converRuleValue ( String ruleValue) {
String value = datetimeFormat. get ( ) . format ( Calendar . getInstance ( ) . getTime ( ) ) ;
return value != null ? value : ruleValue;
}
public static String trimSingleQuote ( String ruleValue) {
if ( oConvertUtils. isEmpty ( ruleValue) ) {
return "" ;
}
if ( ruleValue. startsWith ( QueryGenerator . SQL_SQ) ) {
ruleValue = ruleValue. substring ( 1 ) ;
}
if ( ruleValue. endsWith ( QueryGenerator . SQL_SQ) ) {
ruleValue = ruleValue. substring ( 0 , ruleValue. length ( ) - 1 ) ;
}
return ruleValue;
}
public static String getSqlRuleValue ( String sqlRule) {
try {
Set < String > varParams = getSqlRuleParams ( sqlRule) ;
for ( String var : varParams) {
String tempValue = converRuleValue ( var ) ;
sqlRule = sqlRule. replace ( "#{" + var + "}" , tempValue) ;
}
} catch ( Exception e) {
log. error ( e. getMessage ( ) , e) ;
}
return sqlRule;
}
public static Set < String > getSqlRuleParams ( String sql) {
if ( oConvertUtils. isEmpty ( sql) ) {
return null ;
}
Set < String > varParams = new HashSet < String > ( ) ;
String regex = "\\#\\{\\w+\\}" ;
Pattern p = Pattern . compile ( regex) ;
Matcher m = p. matcher ( sql) ;
while ( m. find ( ) ) {
String var = m. group ( ) ;
varParams. add ( var . substring ( var . indexOf ( "{" ) + 1 , var . indexOf ( "}" ) ) ) ;
}
return varParams;
}
public static String getSingleQueryConditionSql ( String field, String alias, Object value, boolean isString) {
return getSingleQueryConditionSql ( field, alias, value, isString, null ) ;
}
public static String getSingleQueryConditionSql ( String field, String alias, Object value, boolean isString, String dataBaseType) {
if ( value == null ) {
return "" ;
}
field = alias + oConvertUtils. camelToUnderline ( field) ;
QueryRuleEnum rule = QueryGenerator . convert2Rule ( value) ;
return getSingleSqlByRule ( rule, field, value, isString, dataBaseType) ;
}
private static String getSingleSqlByRule ( QueryRuleEnum rule, String field, Object value, boolean isString, String dataBaseType) {
String res = "" ;
switch ( rule) {
case GT:
res = field + rule. getValue ( ) + getFieldConditionValue ( value, isString, dataBaseType) ;
break ;
case GE:
res = field + rule. getValue ( ) + getFieldConditionValue ( value, isString, dataBaseType) ;
break ;
case LT:
res = field + rule. getValue ( ) + getFieldConditionValue ( value, isString, dataBaseType) ;
break ;
case LE:
res = field + rule. getValue ( ) + getFieldConditionValue ( value, isString, dataBaseType) ;
break ;
case EQ:
res = field + rule. getValue ( ) + getFieldConditionValue ( value, isString, dataBaseType) ;
break ;
case EQ_WITH_ADD:
res = field + " = " + getFieldConditionValue ( value, isString, dataBaseType) ;
break ;
case NE:
res = field + " <> " + getFieldConditionValue ( value, isString, dataBaseType) ;
break ;
case IN:
res = field + " in " + getInConditionValue ( value, isString) ;
break ;
case LIKE:
res = field + " like " + getLikeConditionValue ( value, QueryRuleEnum . LIKE) ;
break ;
case LEFT_LIKE:
res = field + " like " + getLikeConditionValue ( value, QueryRuleEnum . LEFT_LIKE) ;
break ;
case RIGHT_LIKE:
res = field + " like " + getLikeConditionValue ( value, QueryRuleEnum . RIGHT_LIKE) ;
break ;
default :
res = field + " = " + getFieldConditionValue ( value, isString, dataBaseType) ;
break ;
}
return res;
}
private static String getSingleSqlByRule ( QueryRuleEnum rule, String field, Object value, boolean isString) {
return getSingleSqlByRule ( rule, field, value, isString, null ) ;
}
private static String getFieldConditionValue ( Object value, boolean isString, String dataBaseType) {
String str = value. toString ( ) . trim ( ) ;
if ( str. startsWith ( SymbolConstant . EXCLAMATORY_MARK) ) {
str = str. substring ( 1 ) ;
} else if ( str. startsWith ( QueryRuleEnum . GE. getValue ( ) ) ) {
str = str. substring ( 2 ) ;
} else if ( str. startsWith ( QueryRuleEnum . LE. getValue ( ) ) ) {
str = str. substring ( 2 ) ;
} else if ( str. startsWith ( QueryRuleEnum . GT. getValue ( ) ) ) {
str = str. substring ( 1 ) ;
} else if ( str. startsWith ( QueryRuleEnum . LT. getValue ( ) ) ) {
str = str. substring ( 1 ) ;
} else if ( str. indexOf ( QUERY_COMMA_ESCAPE) > 0 ) {
str = str. replaceAll ( "\\+\\+" , COMMA) ;
}
if ( dataBaseType == null ) {
dataBaseType = getDbType ( ) ;
}
if ( isString) {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( dataBaseType) ) {
return " N'" + str + "' " ;
} else {
return " '" + str + "' " ;
}
} else {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( dataBaseType) && str. endsWith ( SymbolConstant . SINGLE_QUOTATION_MARK) && str. startsWith ( SymbolConstant . SINGLE_QUOTATION_MARK) ) {
return " N" + str;
}
return value. toString ( ) ;
}
}
private static String getInConditionValue ( Object value, boolean isString) {
String [ ] temp = value. toString ( ) . split ( "," ) ;
if ( temp. length == 0 ) {
return "('')" ;
}
if ( isString) {
List < String > res = new ArrayList < > ( ) ;
for ( String string : temp) {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( getDbType ( ) ) ) {
res. add ( "N'" + string + "'" ) ;
} else {
res. add ( "'" + string + "'" ) ;
}
}
return "(" + String . join ( "," , res) + ")" ;
} else {
return "(" + value. toString ( ) + ")" ;
}
}
private static String getLikeConditionValue ( Object value, QueryRuleEnum ruleEnum) {
String str = value. toString ( ) . trim ( ) ;
if ( str. startsWith ( SymbolConstant . ASTERISK) && str. endsWith ( SymbolConstant . ASTERISK) ) {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( getDbType ( ) ) ) {
return "N'%" + str. substring ( 1 , str. length ( ) - 1 ) + "%'" ;
} else {
return "'%" + str. substring ( 1 , str. length ( ) - 1 ) + "%'" ;
}
} else if ( str. startsWith ( SymbolConstant . ASTERISK) ) {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( getDbType ( ) ) ) {
return "N'%" + str. substring ( 1 ) + "'" ;
} else {
return "'%" + str. substring ( 1 ) + "'" ;
}
} else if ( str. endsWith ( SymbolConstant . ASTERISK) ) {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( getDbType ( ) ) ) {
return "N'" + str. substring ( 0 , str. length ( ) - 1 ) + "%'" ;
} else {
return "'" + str. substring ( 0 , str. length ( ) - 1 ) + "%'" ;
}
} else {
if ( str. indexOf ( SymbolConstant . PERCENT_SIGN) >= 0 ) {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( getDbType ( ) ) ) {
if ( str. startsWith ( SymbolConstant . SINGLE_QUOTATION_MARK) && str. endsWith ( SymbolConstant . SINGLE_QUOTATION_MARK) ) {
return "N" + str;
} else {
return "N" + "'" + str + "'" ;
}
} else {
if ( str. startsWith ( SymbolConstant . SINGLE_QUOTATION_MARK) && str. endsWith ( SymbolConstant . SINGLE_QUOTATION_MARK) ) {
return str;
} else {
return "'" + str + "'" ;
}
}
} else {
if ( ruleEnum == QueryRuleEnum . LEFT_LIKE) {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( getDbType ( ) ) ) {
return "N'%" + str + "'" ;
} else {
return "'%" + str + "'" ;
}
} else if ( ruleEnum == QueryRuleEnum . RIGHT_LIKE) {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( getDbType ( ) ) ) {
return "N'" + str + "%'" ;
} else {
return "'" + str + "%'" ;
}
} else {
if ( DataBaseConstant . DB_TYPE_SQLSERVER. equals ( getDbType ( ) ) ) {
return "N'%" + str + "%'" ;
} else {
return "'%" + str + "%'" ;
}
}
}
}
}
@SuppressWarnings ( { "unchecked" , "rawtypes" } )
public static String installAuthJdbc ( Class < ? > clazz) {
StringBuffer sb = new StringBuffer ( ) ;
Map < String , SysPermissionDataRuleModel > ruleMap = getRuleMap ( ) ;
PropertyDescriptor [ ] origDescriptors = PropertyUtils . getPropertyDescriptors ( clazz) ;
String sqlAnd = " and " ;
for ( String c : ruleMap. keySet ( ) ) {
if ( oConvertUtils. isNotEmpty ( c) && c. startsWith ( SQL_RULES_COLUMN) ) {
sb. append ( sqlAnd + getSqlRuleValue ( ruleMap. get ( c) . getRuleValue ( ) ) ) ;
}
}
String name, column;
for ( int i = 0 ; i < origDescriptors. length; i++ ) {
name = origDescriptors[ i] . getName ( ) ;
if ( judgedIsUselessField ( name) ) {
continue ;
}
if ( ruleMap. containsKey ( name) ) {
column = getTableFieldName ( clazz, name) ;
if ( column == null ) {
continue ;
}
SysPermissionDataRuleModel dataRule = ruleMap. get ( name) ;
QueryRuleEnum rule = QueryRuleEnum . getByValue ( dataRule. getRuleConditions ( ) ) ;
Class propType = origDescriptors[ i] . getPropertyType ( ) ;
boolean isString = propType. equals ( String . class ) ;
Object value;
if ( isString) {
value = converRuleValue ( dataRule. getRuleValue ( ) ) ;
} else {
value = NumberUtils . parseNumber ( dataRule. getRuleValue ( ) , propType) ;
}
String filedSql = getSingleSqlByRule ( rule, oConvertUtils. camelToUnderline ( column) , value, isString) ;
sb. append ( sqlAnd + filedSql) ;
}
}
log. info ( "query auth sql is:" + sb. toString ( ) ) ;
return sb. toString ( ) ;
}
public static void installAuthMplus ( QueryWrapper < ? > queryWrapper, Class < ? > clazz) {
Map < String , SysPermissionDataRuleModel > ruleMap = getRuleMap ( ) ;
PropertyDescriptor [ ] origDescriptors = PropertyUtils . getPropertyDescriptors ( clazz) ;
for ( String c : ruleMap. keySet ( ) ) {
if ( oConvertUtils. isNotEmpty ( c) && c. startsWith ( SQL_RULES_COLUMN) ) {
queryWrapper. and ( i -> i. apply ( getSqlRuleValue ( ruleMap. get ( c) . getRuleValue ( ) ) ) ) ;
}
}
String name, column;
for ( int i = 0 ; i < origDescriptors. length; i++ ) {
name = origDescriptors[ i] . getName ( ) ;
if ( judgedIsUselessField ( name) ) {
continue ;
}
column = getTableFieldName ( clazz, name) ;
if ( column == null ) {
continue ;
}
if ( ruleMap. containsKey ( name) ) {
addRuleToQueryWrapper ( ruleMap. get ( name) , column, origDescriptors[ i] . getPropertyType ( ) , queryWrapper) ;
}
}
}
public static String convertSystemVariables ( String sql) {
return getSqlRuleValue ( sql) ;
}
public static String getAllConfigAuth ( ) {
StringBuffer sb = new StringBuffer ( ) ;
Map < String , SysPermissionDataRuleModel > ruleMap = getRuleMap ( ) ;
String sqlAnd = " and " ;
for ( String c : ruleMap. keySet ( ) ) {
SysPermissionDataRuleModel dataRule = ruleMap. get ( c) ;
String ruleValue = dataRule. getRuleValue ( ) ;
if ( oConvertUtils. isEmpty ( ruleValue) ) {
continue ;
}
if ( oConvertUtils. isNotEmpty ( c) && c. startsWith ( SQL_RULES_COLUMN) ) {
sb. append ( sqlAnd + getSqlRuleValue ( ruleValue) ) ;
} else {
boolean isString = false ;
ruleValue = ruleValue. trim ( ) ;
if ( ruleValue. startsWith ( "'" ) && ruleValue. endsWith ( "'" ) ) {
isString = true ;
ruleValue = ruleValue. substring ( 1 , ruleValue. length ( ) - 1 ) ;
}
QueryRuleEnum rule = QueryRuleEnum . getByValue ( dataRule. getRuleConditions ( ) ) ;
String value = converRuleValue ( ruleValue) ;
String filedSql = getSingleSqlByRule ( rule, c, value, isString) ;
sb. append ( sqlAnd + filedSql) ;
}
}
log. info ( "query auth sql is = " + sb. toString ( ) ) ;
return sb. toString ( ) ;
}
private static String getDbType ( ) {
return CommonUtils . getDatabaseType ( ) ;
}
private static List < Field > getClassFields ( Class < ? > clazz) {
List < Field > list = new ArrayList < Field > ( ) ;
Field [ ] fields;
do {
fields = clazz. getDeclaredFields ( ) ;
for ( int i = 0 ; i < fields. length; i++ ) {
list. add ( fields[ i] ) ;
}
clazz = clazz. getSuperclass ( ) ;
} while ( clazz != Object . class && clazz != null ) ;
return list;
}
private static String getTableFieldName ( Class < ? > clazz, String name) {
try {
Field field = null ;
try {
field = clazz. getDeclaredField ( name) ;
} catch ( NoSuchFieldException e) {
}
if ( field == null ) {
List < Field > allFields = getClassFields ( clazz) ;
List < Field > searchFields = allFields. stream ( ) . filter ( a -> a. getName ( ) . equals ( name) ) . collect ( Collectors . toList ( ) ) ;
if ( searchFields != null && searchFields. size ( ) > 0 ) {
field = searchFields. get ( 0 ) ;
}
}
if ( field != null ) {
TableField tableField = field. getAnnotation ( TableField . class ) ;
if ( tableField != null ) {
if ( tableField. exist ( ) == false ) {
return null ;
} else {
String column = tableField. value ( ) ;
if ( ! "" . equals ( column) ) {
return column;
}
}
}
}
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
return name;
}
private static String specialStrConvert ( String value) {
if ( DataBaseConstant . DB_TYPE_MYSQL. equals ( getDbType ( ) ) || DataBaseConstant . DB_TYPE_MARIADB. equals ( getDbType ( ) ) ) {
String [ ] specialStr = QueryGenerator . LIKE_MYSQL_SPECIAL_STRS. split ( "," ) ;
for ( String str : specialStr) {
if ( value. indexOf ( str) != - 1 ) {
value = value. replace ( str, "\\" + str) ;
}
}
}
return value;
}
}
10
package com. hdx. contractor. util. query ;
public enum QueryRuleEnum {
GT ( ">" , "gt" , "大于" ) ,
GE ( ">=" , "ge" , "大于等于" ) ,
LT ( "<" , "lt" , "小于" ) ,
LE ( "<=" , "le" , "小于等于" ) ,
EQ ( "=" , "eq" , "等于" ) ,
NE ( "!=" , "ne" , "不等于" ) ,
IN ( "IN" , "in" , "包含" ) ,
LIKE ( "LIKE" , "like" , "全模糊" ) ,
LEFT_LIKE ( "LEFT_LIKE" , "left_like" , "左模糊" ) ,
RIGHT_LIKE ( "RIGHT_LIKE" , "right_like" , "右模糊" ) ,
EQ_WITH_ADD ( "EQWITHADD" , "eq_with_add" , "带加号等于" ) ,
LIKE_WITH_AND ( "LIKEWITHAND" , "like_with_and" , "多词模糊匹配————暂时未用上" ) ,
SQL_RULES ( "USE_SQL_RULES" , "ext" , "自定义SQL片段" ) ;
private String value;
private String condition;
private String msg;
QueryRuleEnum ( String value, String condition, String msg) {
this . value = value;
this . condition = condition;
this . msg = msg;
}
public String getValue ( ) {
return value;
}
public void setValue ( String value) {
this . value = value;
}
public String getMsg ( ) {
return msg;
}
public void setMsg ( String msg) {
this . msg = msg;
}
public String getCondition ( ) {
return condition;
}
public void setCondition ( String condition) {
this . condition = condition;
}
public static QueryRuleEnum getByValue ( String value) {
if ( oConvertUtils. isEmpty ( value) ) {
return null ;
}
for ( QueryRuleEnum val : values ( ) ) {
if ( val. getValue ( ) . equals ( value) || val. getCondition ( ) . equals ( value) ) {
return val;
}
}
return null ;
}
}
11
package com. hdx. contractor. util. query ;
import cn. hutool. crypto. SecureUtil ;
import lombok. extern. slf4j. Slf4j ;
import javax. servlet. http. HttpServletRequest ;
import java. lang. reflect. Field ;
import java. util. Set ;
import java. util. regex. Matcher ;
import java. util. regex. Pattern ;
@Slf4j
public class SqlInjectionUtil {
private final static String TABLE_DICT_SIGN_SALT = "20200501" ;
private final static String XSS_STR = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+|user()" ;
private final static String REGULAR_EXPRE_USER = "user[\\s]*\\([\\s]*\\)" ;
private final static String SHOW_TABLES = "show\\s+tables" ;
private final static Pattern SQL_ANNOTATION = Pattern . compile ( "/\\*.*\\*/" ) ;
public static void checkDictTableSign ( String dictCode, String sign, HttpServletRequest request) {
String accessToken = request. getHeader ( "X-Access-Token" ) ;
String signStr = dictCode + SqlInjectionUtil . TABLE_DICT_SIGN_SALT + accessToken;
String javaSign = SecureUtil . md5 ( signStr) ;
if ( ! javaSign. equals ( sign) ) {
log. error ( "表字典,SQL注入漏洞签名校验失败 :" + sign + "!=" + javaSign+ ",dictCode=" + dictCode) ;
throw new RuntimeException ( "无权限访问!" ) ;
}
log. info ( " 表字典,SQL注入漏洞签名校验成功!sign=" + sign + ",dictCode=" + dictCode) ;
}
public static void filterContent ( String value) {
filterContent ( value, null ) ;
}
public static void filterContent ( String value, String customXssString) {
if ( value == null || "" . equals ( value) ) {
return ;
}
checkSqlAnnotation ( value) ;
value = value. toLowerCase ( ) ;
String [ ] xssArr = XSS_STR. split ( "\\|" ) ;
for ( int i = 0 ; i < xssArr. length; i++ ) {
if ( value. indexOf ( xssArr[ i] ) > - 1 ) {
log. error ( "请注意,存在SQL注入关键词---> {}" , xssArr[ i] ) ;
log. error ( "请注意,值可能存在SQL注入风险!---> {}" , value) ;
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
}
if ( customXssString != null ) {
String [ ] xssArr2 = customXssString. split ( "\\|" ) ;
for ( int i = 0 ; i < xssArr2. length; i++ ) {
if ( value. indexOf ( xssArr2[ i] ) > - 1 ) {
log. error ( "请注意,存在SQL注入关键词---> {}" , xssArr2[ i] ) ;
log. error ( "请注意,值可能存在SQL注入风险!---> {}" , value) ;
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
}
}
if ( Pattern . matches ( SHOW_TABLES, value) || Pattern . matches ( REGULAR_EXPRE_USER, value) ) {
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
return ;
}
public static void filterContent ( String [ ] values) {
filterContent ( values, null ) ;
}
public static void filterContent ( String [ ] values, String customXssString) {
String [ ] xssArr = XSS_STR. split ( "\\|" ) ;
for ( String value : values) {
if ( value == null || "" . equals ( value) ) {
return ;
}
checkSqlAnnotation ( value) ;
value = value. toLowerCase ( ) ;
for ( int i = 0 ; i < xssArr. length; i++ ) {
if ( value. indexOf ( xssArr[ i] ) > - 1 ) {
log. error ( "请注意,存在SQL注入关键词---> {}" , xssArr[ i] ) ;
log. error ( "请注意,值可能存在SQL注入风险!---> {}" , value) ;
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
}
if ( customXssString != null ) {
String [ ] xssArr2 = customXssString. split ( "\\|" ) ;
for ( int i = 0 ; i < xssArr2. length; i++ ) {
if ( value. indexOf ( xssArr2[ i] ) > - 1 ) {
log. error ( "请注意,存在SQL注入关键词---> {}" , xssArr2[ i] ) ;
log. error ( "请注意,值可能存在SQL注入风险!---> {}" , value) ;
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
}
}
if ( Pattern . matches ( SHOW_TABLES, value) || Pattern . matches ( REGULAR_EXPRE_USER, value) ) {
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
}
return ;
}
public static void specialFilterContentForDictSql ( String value) {
String specialXssStr = " exec |extractvalue|updatexml| insert | select | delete | update | drop | count | chr | mid | master | truncate | char | declare |;|+|user()" ;
String [ ] xssArr = specialXssStr. split ( "\\|" ) ;
if ( value == null || "" . equals ( value) ) {
return ;
}
checkSqlAnnotation ( value) ;
value = value. toLowerCase ( ) ;
for ( int i = 0 ; i < xssArr. length; i++ ) {
if ( value. indexOf ( xssArr[ i] ) > - 1 || value. startsWith ( xssArr[ i] . trim ( ) ) ) {
log. error ( "请注意,存在SQL注入关键词---> {}" , xssArr[ i] ) ;
log. error ( "请注意,值可能存在SQL注入风险!---> {}" , value) ;
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
}
if ( Pattern . matches ( SHOW_TABLES, value) || Pattern . matches ( REGULAR_EXPRE_USER, value) ) {
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
return ;
}
public static void specialFilterContentForOnlineReport ( String value) {
String specialXssStr = " exec |extractvalue|updatexml| insert | delete | update | drop | chr | mid | master | truncate | char | declare |user()" ;
String [ ] xssArr = specialXssStr. split ( "\\|" ) ;
if ( value == null || "" . equals ( value) ) {
return ;
}
checkSqlAnnotation ( value) ;
value = value. toLowerCase ( ) ;
for ( int i = 0 ; i < xssArr. length; i++ ) {
if ( value. indexOf ( xssArr[ i] ) > - 1 || value. startsWith ( xssArr[ i] . trim ( ) ) ) {
log. error ( "请注意,存在SQL注入关键词---> {}" , xssArr[ i] ) ;
log. error ( "请注意,值可能存在SQL注入风险!---> {}" , value) ;
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
}
if ( Pattern . matches ( SHOW_TABLES, value) || Pattern . matches ( REGULAR_EXPRE_USER, value) ) {
throw new RuntimeException ( "请注意,值可能存在SQL注入风险!--->" + value) ;
}
return ;
}
public static boolean isClassField ( String field, Class clazz) {
Field [ ] fields = clazz. getDeclaredFields ( ) ;
for ( int i= 0 ; i< fields. length; i++ ) {
String fieldName = fields[ i] . getName ( ) ;
String tableColumnName = oConvertUtils. camelToUnderline ( fieldName) ;
if ( fieldName. equalsIgnoreCase ( field) || tableColumnName. equalsIgnoreCase ( field) ) {
return true ;
}
}
return false ;
}
public static boolean isClassField ( Set < String > fieldSet, Class clazz) {
Field [ ] fields = clazz. getDeclaredFields ( ) ;
for ( String field: fieldSet) {
boolean exist = false ;
for ( int i= 0 ; i< fields. length; i++ ) {
String fieldName = fields[ i] . getName ( ) ;
String tableColumnName = oConvertUtils. camelToUnderline ( fieldName) ;
if ( fieldName. equalsIgnoreCase ( field) || tableColumnName. equalsIgnoreCase ( field) ) {
exist = true ;
break ;
}
}
if ( ! exist) {
return false ;
}
}
return true ;
}
public static void checkSqlAnnotation ( String str) {
Matcher matcher = SQL_ANNOTATION. matcher ( str) ;
if ( matcher. find ( ) ) {
String error = "请注意,值可能存在SQL注入风险---> \\*.*\\" ;
log. error ( error) ;
throw new RuntimeException ( error) ;
}
}
}
12
package com. hdx. contractor. util. query ;
public class SymbolConstant {
public static final String SPOT = "." ;
public static final String DOUBLE_BACKSLASH = "\\" ;
public static final String COLON = ":" ;
public static final String COMMA = "," ;
public static final String LEFT_CURLY_BRACKET = "{" ;
public static final String RIGHT_CURLY_BRACKET = "}" ;
public static final String WELL_NUMBER = "#" ;
public static final String SINGLE_SLASH = "/" ;
public static final String DOUBLE_SLASH = "//" ;
public static final String EXCLAMATORY_MARK = "!" ;
public static final String UNDERLINE = "_" ;
public static final String SINGLE_QUOTATION_MARK = "'" ;
public static final String ASTERISK = "*" ;
public static final String PERCENT_SIGN = "%" ;
public static final String DOLLAR = "$" ;
public static final String AND = "&" ;
public static final String equals = "=" ;
public static final String SPOT_SINGLE_SLASH = "../" ;
public static final String SPOT_DOUBLE_BACKSLASH = "..\\" ;
public static final String SYS_VAR_PREFIX = "#{" ;
public static final String DOUBLE_LEFT_CURLY_BRACKET = "{{" ;
public static final String SQUARE_BRACKETS_LEFT = "[" ;
public static final String SQUARE_BRACKETS_RIGHT = "]" ;
}
13
package com. hdx. contractor. util. query ;
import java. util. Date ;
public class SysPermissionDataRuleModel {
private String id;
private String permissionId;
private String ruleName;
private String ruleColumn;
private String ruleConditions;
private String ruleValue;
private Date createTime;
private String createBy;
private Date updateTime;
private String updateBy;
public String getId ( ) {
return id;
}
public void setId ( String id) {
this . id = id;
}
public String getPermissionId ( ) {
return permissionId;
}
public void setPermissionId ( String permissionId) {
this . permissionId = permissionId;
}
public String getRuleName ( ) {
return ruleName;
}
public void setRuleName ( String ruleName) {
this . ruleName = ruleName;
}
public String getRuleColumn ( ) {
return ruleColumn;
}
public void setRuleColumn ( String ruleColumn) {
this . ruleColumn = ruleColumn;
}
public String getRuleConditions ( ) {
return ruleConditions;
}
public void setRuleConditions ( String ruleConditions) {
this . ruleConditions = ruleConditions;
}
public String getRuleValue ( ) {
return ruleValue;
}
public void setRuleValue ( String ruleValue) {
this . ruleValue = ruleValue;
}
public Date getCreateTime ( ) {
return createTime;
}
public void setCreateTime ( Date createTime) {
this . createTime = createTime;
}
public String getCreateBy ( ) {
return createBy;
}
public void setCreateBy ( String createBy) {
this . createBy = createBy;
}
public Date getUpdateTime ( ) {
return updateTime;
}
public void setUpdateTime ( Date updateTime) {
this . updateTime = updateTime;
}
public String getUpdateBy ( ) {
return updateBy;
}
public void setUpdateBy ( String updateBy) {
this . updateBy = updateBy;
}
}
14
package com. hdx. contractor. util ;
import org. springframework. beans. BeansException ;
import org. springframework. context. ApplicationContext ;
import org. springframework. context. ApplicationContextAware ;
import org. springframework. stereotype. Component ;
import org. springframework. web. context. request. RequestContextHolder ;
import org. springframework. web. context. request. ServletRequestAttributes ;
import javax. servlet. http. HttpServletRequest ;
@Component
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext ( ApplicationContext applicationContext)
throws BeansException {
SpringContextUtils . applicationContext = applicationContext;
}
public static Object getBean ( String name) {
return applicationContext. getBean ( name) ;
}
public static < T > T getBean ( Class < T > requiredType) {
return applicationContext. getBean ( requiredType) ;
}
public static < T > T getBean ( String name, Class < T > requiredType) {
return applicationContext. getBean ( name, requiredType) ;
}
public static boolean containsBean ( String name) {
return applicationContext. containsBean ( name) ;
}
public static boolean isSingleton ( String name) {
return applicationContext. isSingleton ( name) ;
}
public static Class < ? extends Object > getType ( String name) {
return applicationContext. getType ( name) ;
}
public static HttpServletRequest getHttpServletRequest ( ) {
return ( ( ServletRequestAttributes ) RequestContextHolder . getRequestAttributes ( ) ) . getRequest ( ) ;
}
public static ApplicationContext getApplicationContext ( ) {
return applicationContext;
}
}