BaseController

BaseController 所有业务接口的父类

胡思乱想

父类可以帮助我们的代码变得很精炼。
其次、思考我们的业务接口共同的特定有哪些?

  1. 所有的接口都有可能用到 缓存和日志,将其注入。

  2. 粗略的说,接口有五种

list 参数多为 JSONObject
add 参数多为 自定义的 model
get 参数多为 id
update 参数多为 自定义 的 model
delete 参数多为 id
因此我们需要考虑在 BaseController 中将 JSONObject 转换为 常用的 Map,以更方便的操作。

  1. 每个请求都有它所归属的会话 ,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);
        }
    }
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值