BaseController 所有业务接口的父类
胡思乱想
父类可以帮助我们的代码变得很精炼。
其次、思考我们的业务接口共同的特定有哪些?
-
所有的接口都有可能用到 缓存和日志,将其注入。
-
粗略的说,接口有五种
list 参数多为 JSONObject
add 参数多为 自定义的 model
get 参数多为 id
update 参数多为 自定义 的 model
delete 参数多为 id
因此我们需要考虑在 BaseController 中将 JSONObject 转换为 常用的 Map,以更方便的操作。
- 每个请求都有它所归属的会话 ,session
当交互功能丰富起来后,我们就需要为每个请求特定性,以提供更好更精确的服务。
一般会在Controller 中处理会话信息,不将他带到 Service 层中,会污染 Service。Service 应该是无属性的纯业务层。
因此 BaseController 是处理 session 最理想的地方。
package com.vito.framework.base.controller;
import com.alibaba.fastjson.JSONObject;
import com.vito.framework.cache.CacheKeys;
import com.vito.framework.cache.ICache;
import com.vito.framework.rest.bean.AppSession;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
public abstract class BaseController {
protected static final Logger logger = LoggerFactory.getLogger(BaseController.class);
/**
* 管理基础路径
*/
@Value("${adminPath}")
protected String adminPath;
@Autowired
protected ICache cacheUtil;
@Autowired
protected HttpServletRequest request;
protected Map<String, Object> getParamMap(JSONObject params) {
Map<String, Object> paramMap = JSONObject.toJavaObject(params, Map.class);
if (!StringUtils.isEmpty(params.getString("param_keyword"))) {
String value = params.getString("param_keyword");
value = value.replace("%", "\\%");
value = value.replace("_", "\\_");
paramMap.put("param_keyword", value);
}
if (params.getIntValue("page_num") > 0 && params.getIntValue("page_size") > 0) {
int page_num = params.getIntValue("page_num");
int page_size = params.getIntValue("page_size");
paramMap.put("param_curpage", (page_num - 1) * page_size);
paramMap.put("param_ipagecount", page_size);
}
return paramMap;
}
/**
* @return String
* @Description:获取访问用户会话ID
*/
public String getSessionId() {
return request.getHeader(CacheKeys.ADMIN_REQUEST_HEADER);
}
/**
* @return appSession
* @Description:获取访问用户权限
*/
public AppSession getUserSession() {
String token = getSessionId();
return cacheUtil.get(CacheKeys.ADMIN_APP_SESSION + token);
}
/**
* @param appSession
* @return void
* @Description:设置访问用户权限
*/
public void setUserSession(AppSession appSession) {
cacheUtil.put(CacheKeys.ADMIN_APP_SESSION + appSession.getSessionId(), appSession, CacheKeys.USER_TOKEN_EXPIRETIME);
}
}
代码解释:
第一个方法就是为了给 list 服务,将 JSONObject 转为 Map
list 还有关键字查询、分页等都考虑进去。
每个会话建立之初就会向后台请求一个 token,之后的所有请求中都会带上这个 token。
这个方法我们常命名为 getToken
因此这儿我们采用 getSessionId 来获取 Header 中携带的 token,毕竟 getToken 在别处用了。
有了会话的唯一标识,我们就可以给他建立他的信息存放处,也就可以获取他对应的信息。这儿也就是AppSession ,这儿定义了我们想要存储的信息。根据会话对象的身份会有不同的设置。
当BaseController 建立好后,所有接口都能实现点对点的服务了。
客户方
上面是管理端的 BaseController (admin、merchant)
还有客户访问的 BaseResource,在拥有以上功能的基础上还增加了 顾客信息 的存储。
/**
* @return Member
* @Description:获取会员信息
*/
public Member getMember() {
String token = getSessionId();
return cacheUtil.get(CacheKeys.MEMBER + token);
}
/**
* @return void
* @Description:缓存会员信息
*/
public void setMember(String sessionId, Member member) {
if (member != null && request.getSession() != null) {
cacheUtil.put(CacheKeys.MEMBER + sessionId, member, CacheKeys.APP_TOKEN_EXPIRETIME);
}
}