@@ -5,9 +5,9 @@ | |||||
* The ASF licenses this file to You under the Apache License, Version 2.0 | * The ASF licenses this file to You under the Apache License, Version 2.0 | ||||
* (the "License"); you may not use this file except in compliance with | * (the "License"); you may not use this file except in compliance with | ||||
* the License. You may obtain a copy of the License at | * the License. You may obtain a copy of the License at | ||||
* | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | * http://www.apache.org/licenses/LICENSE-2.0 | ||||
* | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | * Unless required by applicable law or agreed to in writing, software | ||||
* distributed under the License is distributed on an "AS IS" BASIS, | * distributed under the License is distributed on an "AS IS" BASIS, | ||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
@@ -23,9 +23,6 @@ package me.chanjar.weixin.common.session; | |||||
* | * | ||||
* @author Craig R. McClanahan | * @author Craig R. McClanahan | ||||
*/ | */ | ||||
public class Constants { | public class Constants { | ||||
public static final String Package = "me.chanjar.weixin.common.session"; | |||||
public static final String PACKAGE = "me.chanjar.weixin.common.session"; | |||||
} | } |
@@ -11,13 +11,12 @@ public class StandardSession implements WxSession, InternalSession { | |||||
/** | /** | ||||
* The string manager for this package. | * The string manager for this package. | ||||
*/ | */ | ||||
protected static final StringManager sm = StringManager.getManager(Constants.Package); | |||||
protected static final StringManager SM = StringManager.getManager(Constants.PACKAGE); | |||||
/** | /** | ||||
* Type array. | * Type array. | ||||
*/ | */ | ||||
private static final String[] EMPTY_ARRAY = new String[0]; | private static final String[] EMPTY_ARRAY = new String[0]; | ||||
// ------------------------------ WxSession | |||||
protected Map<String, Object> attributes = new ConcurrentHashMap<>(); | protected Map<String, Object> attributes = new ConcurrentHashMap<>(); | ||||
/** | /** | ||||
* The session identifier of this Session. | * The session identifier of this Session. | ||||
@@ -73,7 +72,7 @@ public class StandardSession implements WxSession, InternalSession { | |||||
if (!isValidInternal()) { | if (!isValidInternal()) { | ||||
throw new IllegalStateException | throw new IllegalStateException | ||||
(sm.getString("sessionImpl.getAttribute.ise")); | |||||
(SM.getString("sessionImpl.getAttribute.ise")); | |||||
} | } | ||||
if (name == null) { | if (name == null) { | ||||
@@ -86,7 +85,7 @@ public class StandardSession implements WxSession, InternalSession { | |||||
@Override | @Override | ||||
public Enumeration<String> getAttributeNames() { | public Enumeration<String> getAttributeNames() { | ||||
if (!isValidInternal()) { | if (!isValidInternal()) { | ||||
throw new IllegalStateException(sm.getString("sessionImpl.getAttributeNames.ise")); | |||||
throw new IllegalStateException(SM.getString("sessionImpl.getAttributeNames.ise")); | |||||
} | } | ||||
Set<String> names = new HashSet<>(); | Set<String> names = new HashSet<>(); | ||||
@@ -98,7 +97,7 @@ public class StandardSession implements WxSession, InternalSession { | |||||
public void setAttribute(String name, Object value) { | public void setAttribute(String name, Object value) { | ||||
// Name cannot be null | // Name cannot be null | ||||
if (name == null) { | if (name == null) { | ||||
throw new IllegalArgumentException(sm.getString("sessionImpl.setAttribute.namenull")); | |||||
throw new IllegalArgumentException(SM.getString("sessionImpl.setAttribute.namenull")); | |||||
} | } | ||||
// Null value is the same as removeAttribute() | // Null value is the same as removeAttribute() | ||||
@@ -109,7 +108,7 @@ public class StandardSession implements WxSession, InternalSession { | |||||
// Validate our current state | // Validate our current state | ||||
if (!isValidInternal()) { | if (!isValidInternal()) { | ||||
throw new IllegalStateException(sm.getString("sessionImpl.setAttribute.ise", getIdInternal())); | |||||
throw new IllegalStateException(SM.getString("sessionImpl.setAttribute.ise", getIdInternal())); | |||||
} | } | ||||
this.attributes.put(name, value); | this.attributes.put(name, value); | ||||
@@ -123,8 +122,9 @@ public class StandardSession implements WxSession, InternalSession { | |||||
@Override | @Override | ||||
public void invalidate() { | public void invalidate() { | ||||
if (!isValidInternal()) | |||||
throw new IllegalStateException(sm.getString("sessionImpl.invalidate.ise")); | |||||
if (!isValidInternal()) { | |||||
throw new IllegalStateException(SM.getString("sessionImpl.invalidate.ise")); | |||||
} | |||||
// Cause this session to expire | // Cause this session to expire | ||||
expire(); | expire(); | ||||
@@ -13,8 +13,7 @@ import java.util.concurrent.atomic.AtomicBoolean; | |||||
*/ | */ | ||||
public class StandardSessionManager implements WxSessionManager, InternalSessionManager { | public class StandardSessionManager implements WxSessionManager, InternalSessionManager { | ||||
protected static final StringManager sm = | |||||
StringManager.getManager(Constants.Package); | |||||
protected static final StringManager SM = StringManager.getManager(Constants.PACKAGE); | |||||
/** | /** | ||||
* The descriptive name of this Manager implementation (for logging). | * The descriptive name of this Manager implementation (for logging). | ||||
*/ | */ | ||||
@@ -82,7 +81,7 @@ public class StandardSessionManager implements WxSessionManager, InternalSession | |||||
public WxSession getSession(String sessionId, boolean create) { | public WxSession getSession(String sessionId, boolean create) { | ||||
if (sessionId == null) { | if (sessionId == null) { | ||||
throw new IllegalStateException | throw new IllegalStateException | ||||
(sm.getString("sessionManagerImpl.getSession.ise")); | |||||
(SM.getString("sessionManagerImpl.getSession.ise")); | |||||
} | } | ||||
InternalSession session = findSession(sessionId); | InternalSession session = findSession(sessionId); | ||||
@@ -124,25 +123,24 @@ public class StandardSessionManager implements WxSessionManager, InternalSession | |||||
@Override | @Override | ||||
public InternalSession findSession(String id) { | public InternalSession findSession(String id) { | ||||
if (id == null) | |||||
if (id == null) { | |||||
return (null); | return (null); | ||||
} | |||||
return this.sessions.get(id); | return this.sessions.get(id); | ||||
} | } | ||||
@Override | @Override | ||||
public InternalSession createSession(String sessionId) { | public InternalSession createSession(String sessionId) { | ||||
if (sessionId == null) { | if (sessionId == null) { | ||||
throw new IllegalStateException | throw new IllegalStateException | ||||
(sm.getString("sessionManagerImpl.createSession.ise")); | |||||
(SM.getString("sessionManagerImpl.createSession.ise")); | |||||
} | } | ||||
if ((this.maxActiveSessions >= 0) && | if ((this.maxActiveSessions >= 0) && | ||||
(getActiveSessions() >= this.maxActiveSessions)) { | (getActiveSessions() >= this.maxActiveSessions)) { | ||||
this.rejectedSessions++; | this.rejectedSessions++; | ||||
throw new TooManyActiveSessionsException( | throw new TooManyActiveSessionsException( | ||||
sm.getString("sessionManagerImpl.createSession.tmase"), | |||||
SM.getString("sessionManagerImpl.createSession.tmase"), | |||||
this.maxActiveSessions); | this.maxActiveSessions); | ||||
} | } | ||||
@@ -230,8 +228,9 @@ public class StandardSessionManager implements WxSessionManager, InternalSession | |||||
@Override | @Override | ||||
public void backgroundProcess() { | public void backgroundProcess() { | ||||
this.count = (this.count + 1) % this.processExpiresFrequency; | this.count = (this.count + 1) % this.processExpiresFrequency; | ||||
if (this.count == 0) | |||||
if (this.count == 0) { | |||||
processExpires(); | processExpires(); | ||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -243,16 +242,18 @@ public class StandardSessionManager implements WxSessionManager, InternalSession | |||||
InternalSession sessions[] = findSessions(); | InternalSession sessions[] = findSessions(); | ||||
int expireHere = 0; | int expireHere = 0; | ||||
if (this.log.isDebugEnabled()) | |||||
if (this.log.isDebugEnabled()) { | |||||
this.log.debug("Start expire sessions {} at {} sessioncount {}", getName(), timeNow, sessions.length); | this.log.debug("Start expire sessions {} at {} sessioncount {}", getName(), timeNow, sessions.length); | ||||
for (int i = 0; i < sessions.length; i++) { | |||||
if (sessions[i] != null && !sessions[i].isValid()) { | |||||
} | |||||
for (InternalSession session : sessions) { | |||||
if (session != null && !session.isValid()) { | |||||
expireHere++; | expireHere++; | ||||
} | } | ||||
} | } | ||||
long timeEnd = System.currentTimeMillis(); | long timeEnd = System.currentTimeMillis(); | ||||
if (this.log.isDebugEnabled()) | |||||
if (this.log.isDebugEnabled()) { | |||||
this.log.debug("End expire sessions {} processingTime {} expired sessions: {}", getName(), timeEnd - timeNow, expireHere); | this.log.debug("End expire sessions {} processingTime {} expired sessions: {}", getName(), timeEnd - timeNow, expireHere); | ||||
} | |||||
this.processingTime += (timeEnd - timeNow); | this.processingTime += (timeEnd - timeNow); | ||||
} | } | ||||
@@ -28,10 +28,10 @@ import java.util.Random; | |||||
*/ | */ | ||||
public class WxCryptUtil { | public class WxCryptUtil { | ||||
private static final Base64 base64 = new Base64(); | |||||
private static final Base64 BASE64 = new Base64(); | |||||
private static final Charset CHARSET = StandardCharsets.UTF_8; | private static final Charset CHARSET = StandardCharsets.UTF_8; | ||||
private static final ThreadLocal<DocumentBuilder> builderLocal = new ThreadLocal<DocumentBuilder>() { | |||||
private static final ThreadLocal<DocumentBuilder> BUILDER_LOCAL = new ThreadLocal<DocumentBuilder>() { | |||||
@Override | @Override | ||||
protected DocumentBuilder initialValue() { | protected DocumentBuilder initialValue() { | ||||
try { | try { | ||||
@@ -65,7 +65,7 @@ public class WxCryptUtil { | |||||
static String extractEncryptPart(String xml) { | static String extractEncryptPart(String xml) { | ||||
try { | try { | ||||
DocumentBuilder db = builderLocal.get(); | |||||
DocumentBuilder db = BUILDER_LOCAL.get(); | |||||
Document document = db.parse(new InputSource(new StringReader(xml))); | Document document = db.parse(new InputSource(new StringReader(xml))); | ||||
Element root = document.getDocumentElement(); | Element root = document.getDocumentElement(); | ||||
@@ -192,7 +192,7 @@ public class WxCryptUtil { | |||||
byte[] encrypted = cipher.doFinal(unencrypted); | byte[] encrypted = cipher.doFinal(unencrypted); | ||||
// 使用BASE64对加密后的字符串进行编码 | // 使用BASE64对加密后的字符串进行编码 | ||||
return base64.encodeToString(encrypted); | |||||
return BASE64.encodeToString(encrypted); | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
throw new RuntimeException(e); | throw new RuntimeException(e); | ||||
} | } | ||||
@@ -4,5 +4,16 @@ package me.chanjar.weixin.common.util.http; | |||||
* Created by ecoolper on 2017/4/28. | * Created by ecoolper on 2017/4/28. | ||||
*/ | */ | ||||
public enum HttpType { | public enum HttpType { | ||||
JODD_HTTP, APACHE_HTTP, OK_HTTP; | |||||
/** | |||||
* jodd-http. | |||||
*/ | |||||
JODD_HTTP, | |||||
/** | |||||
* apache httpclient. | |||||
*/ | |||||
APACHE_HTTP, | |||||
/** | |||||
* okhttp. | |||||
*/ | |||||
OK_HTTP | |||||
} | } |
@@ -46,8 +46,7 @@ import java.util.*; | |||||
*/ | */ | ||||
public class StringManager { | public class StringManager { | ||||
private static final Map<String, Map<Locale, StringManager>> managers = | |||||
new Hashtable<>(); | |||||
private static final Map<String, Map<Locale, StringManager>> MANAGERS = new Hashtable<>(); | |||||
private static int LOCALE_CACHE_SIZE = 10; | private static int LOCALE_CACHE_SIZE = 10; | ||||
/** | /** | ||||
* The ResourceBundle for this StringManager. | * The ResourceBundle for this StringManager. | ||||
@@ -118,16 +117,16 @@ public class StringManager { | |||||
public static final synchronized StringManager getManager( | public static final synchronized StringManager getManager( | ||||
String packageName, Locale locale) { | String packageName, Locale locale) { | ||||
Map<Locale, StringManager> map = managers.get(packageName); | |||||
Map<Locale, StringManager> map = MANAGERS.get(packageName); | |||||
if (map == null) { | if (map == null) { | ||||
/* | |||||
* Don't want the HashMap to be expanded beyond LOCALE_CACHE_SIZE. | |||||
* Expansion occurs when size() exceeds capacity. Therefore keep | |||||
* size at or below capacity. | |||||
* removeEldestEntry() executes after insertion therefore the test | |||||
* for removal needs to use one less than the maximum desired size | |||||
* | |||||
*/ | |||||
/* | |||||
* Don't want the HashMap to be expanded beyond LOCALE_CACHE_SIZE. | |||||
* Expansion occurs when size() exceeds capacity. Therefore keep | |||||
* size at or below capacity. | |||||
* removeEldestEntry() executes after insertion therefore the test | |||||
* for removal needs to use one less than the maximum desired size | |||||
* | |||||
*/ | |||||
map = new LinkedHashMap<Locale, StringManager>(LOCALE_CACHE_SIZE, 1, true) { | map = new LinkedHashMap<Locale, StringManager>(LOCALE_CACHE_SIZE, 1, true) { | ||||
private static final long serialVersionUID = 1L; | private static final long serialVersionUID = 1L; | ||||
@@ -137,7 +136,7 @@ public class StringManager { | |||||
return size() > (LOCALE_CACHE_SIZE - 1); | return size() > (LOCALE_CACHE_SIZE - 1); | ||||
} | } | ||||
}; | }; | ||||
managers.put(packageName, map); | |||||
MANAGERS.put(packageName, map); | |||||
} | } | ||||
StringManager mgr = map.get(locale); | StringManager mgr = map.get(locale); | ||||
@@ -16,8 +16,14 @@ import java.util.List; | |||||
@Data | @Data | ||||
public class WxCpUser implements Serializable { | public class WxCpUser implements Serializable { | ||||
public enum Gender { | public enum Gender { | ||||
/** | |||||
* 男 | |||||
*/ | |||||
MALE("男", "1"), | MALE("男", "1"), | ||||
FEMAIL("女", "2"); | |||||
/** | |||||
* 女 | |||||
*/ | |||||
FEMALE("女", "2"); | |||||
private String genderName; | private String genderName; | ||||
private String code; | private String code; | ||||
@@ -40,7 +46,7 @@ public class WxCpUser implements Serializable { | |||||
return Gender.MALE; | return Gender.MALE; | ||||
} | } | ||||
if ("2".equals(code)) { | if ("2".equals(code)) { | ||||
return Gender.FEMAIL; | |||||
return Gender.FEMALE; | |||||
} | } | ||||
return null; | return null; | ||||
@@ -37,7 +37,7 @@ public class WxCpUserServiceImplTest { | |||||
user.setName("Some Woman"); | user.setName("Some Woman"); | ||||
user.setDepartIds(new Integer[]{2}); | user.setDepartIds(new Integer[]{2}); | ||||
user.setEmail("none@none.com"); | user.setEmail("none@none.com"); | ||||
user.setGender(WxCpUser.Gender.FEMAIL); | |||||
user.setGender(WxCpUser.Gender.FEMALE); | |||||
user.setMobile("13560084979"); | user.setMobile("13560084979"); | ||||
user.setPosition("woman"); | user.setPosition("woman"); | ||||
user.setTelephone("3300393"); | user.setTelephone("3300393"); | ||||
@@ -213,7 +213,7 @@ public class WxMpCardServiceImpl implements WxMpCardService { | |||||
WxMpCardResult cardResult = WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement, | WxMpCardResult cardResult = WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement, | ||||
new TypeToken<WxMpCardResult>() { | new TypeToken<WxMpCardResult>() { | ||||
}.getType()); | }.getType()); | ||||
if (!cardResult.getErrorCode().equals("0")) { | |||||
if (!"0".equals(cardResult.getErrorCode())) { | |||||
this.log.warn("朋友的券mark失败:{}", cardResult.getErrorMsg()); | this.log.warn("朋友的券mark失败:{}", cardResult.getErrorMsg()); | ||||
} | } | ||||
} | } | ||||
@@ -227,6 +227,7 @@ public abstract class WxMpServiceAbstractImpl<H, P> implements WxMpService, Requ | |||||
/** | /** | ||||
* 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求 | * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求 | ||||
*/ | */ | ||||
@Override | |||||
public <T, E> T execute(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException { | public <T, E> T execute(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException { | ||||
int retryTimes = 0; | int retryTimes = 0; | ||||
do { | do { | ||||
@@ -30,7 +30,7 @@ import java.util.Map; | |||||
* @author <a href="https://github.com/007gzs">007</a> | * @author <a href="https://github.com/007gzs">007</a> | ||||
*/ | */ | ||||
public class WxOpenComponentServiceImpl implements WxOpenComponentService { | public class WxOpenComponentServiceImpl implements WxOpenComponentService { | ||||
private static final Map<String, WxMpService> wxOpenMpServiceMap = new Hashtable<>(); | |||||
private static final Map<String, WxMpService> WX_OPEN_MP_SERVICE_MAP = new Hashtable<>(); | |||||
protected final Logger log = LoggerFactory.getLogger(this.getClass()); | protected final Logger log = LoggerFactory.getLogger(this.getClass()); | ||||
private WxOpenService wxOpenService; | private WxOpenService wxOpenService; | ||||
@@ -40,14 +40,14 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { | |||||
@Override | @Override | ||||
public WxMpService getWxMpServiceByAppid(String appId) { | public WxMpService getWxMpServiceByAppid(String appId) { | ||||
WxMpService wxMpService = wxOpenMpServiceMap.get(appId); | |||||
WxMpService wxMpService = WX_OPEN_MP_SERVICE_MAP.get(appId); | |||||
if (wxMpService == null) { | if (wxMpService == null) { | ||||
synchronized (wxOpenMpServiceMap) { | |||||
wxMpService = wxOpenMpServiceMap.get(appId); | |||||
synchronized (WX_OPEN_MP_SERVICE_MAP) { | |||||
wxMpService = WX_OPEN_MP_SERVICE_MAP.get(appId); | |||||
if (wxMpService == null) { | if (wxMpService == null) { | ||||
wxMpService = new WxOpenMpServiceImpl(this, appId, getWxOpenConfigStorage().getWxMpConfigStorage(appId)); | wxMpService = new WxOpenMpServiceImpl(this, appId, getWxOpenConfigStorage().getWxMpConfigStorage(appId)); | ||||
wxOpenMpServiceMap.put(appId, wxMpService); | |||||
WX_OPEN_MP_SERVICE_MAP.put(appId, wxMpService); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -30,6 +30,7 @@ public abstract class WxOpenServiceAbstractImpl<H, P> implements WxOpenService, | |||||
return wxOpenConfigStorage; | return wxOpenConfigStorage; | ||||
} | } | ||||
@Override | |||||
public void setWxOpenConfigStorage(WxOpenConfigStorage wxOpenConfigStorage) { | public void setWxOpenConfigStorage(WxOpenConfigStorage wxOpenConfigStorage) { | ||||
this.wxOpenConfigStorage = wxOpenConfigStorage; | this.wxOpenConfigStorage = wxOpenConfigStorage; | ||||
} | } | ||||