20190723 BaseController封装

本文介绍了一个SpringBoot项目中如何通过基类BaseController实现统一的异常处理、工具方法封装及请求信息获取等通用操作,包括了从请求头中获取用户信息、设备信息、系统code等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、BaseService的封装思路一样,很多通用性的方法都可以放在父类里面

2、请求头获取信息;

3、工具性操作封装到父类里面;

4、如果获取不到值,直接抛异常;

package com.yunque.www.springbootdemo.base;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yunque.www.springbootdemo.exceptions.PicaException;
import com.yunque.www.springbootdemo.exceptions.PicaResultCode;
import com.yunque.www.springbootdemo.pojo.BaseResult;
import com.yunque.www.springbootdemo.redis.RedisUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public abstract class BaseController {

    public Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    public RedisUtils redisUtils;

    //todo:把通用性的操作封装到父类里面
    @Autowired
    private DoctorServiceClient doctorServiceClient;

    @Autowired
    private PermissionServiceClient permissionServiceClient;


    public PicaUser getPicaUser() {
        return this.getCurrentPicaUser();
    }

    public PicaUser fetchPicaUser() {
        return this.getCurrentPicaUser();
    }


    /**
     * 封装统一的返回对象
     *
     * @param data
     * @param <T>
     * @return
     */
    public <T> BaseResult<T> getBaseResult(T data) {
        BaseResult baseResult = BaseResult.buildSuccess();
        baseResult.setData(data);
        return baseResult;
    }

    /**
     * 获取PicaUser
     *
     * @return
     */
    public PicaUser getCurrentPicaUser() {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = servletRequestAttributes.getRequest();
        String token = request.getHeader("token");
        PicaUser picaUser = null;
        if (StringUtils.isEmpty(token)) {
            return null;
        } else {
            //封装redis中的方法
            picaUser = redisUtils.getToken(token, PicaUser.class);
            if (picaUser != null) {
                picaUser.setToken(token);
            }
        }
        return picaUser;
    }

    /**
     * 从请求头中获取token
     *
     * @return
     */
    public String getTokenFromHeader() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return requestAttributes.getRequest().getHeader("token");
    }

    /**
     * 从请求头中获取系统code
     *
     * @return
     */
    public String getSysCodeFromHeader() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return requestAttributes.getRequest().getHeader("sysCode");
    }

    /**
     * 从请求头中获取设备信息
     *
     * @return
     */
    public String getDeviceInfoFromHeader() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return requestAttributes.getRequest().getHeader("deviceInfo");
    }

    /**
     * 获取请求头信息
     *
     * @return
     */
    public Map<String, Object> getHeader() {
        Map<String, Object> map = new HashMap<>();
        map.put("picaUser", this.getCurrentPicaUser());
        map.put("sysCode", this.getSysCodeFromHeader());
        map.put("deviceInfo", this.getDeviceInfoFromHeader());
        return map;
    }

    /**
     * 获取请求的ip地址
     *
     * @return
     */
    protected final String getIpAddr() {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        String ip = request.getHeader("x-forwarded-for");
        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }

        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }

        if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        return ip;
    }


    /**
     * 获取app版本号
     *
     * @return
     */
    public String getAppVersion() {
        String deviceInfoFromHeader = this.getDeviceInfoFromHeader();
        if (StringUtils.isEmpty(deviceInfoFromHeader)) {
            return "";
        }
        //todo:转化成json字符串获取其中某一个键值对的值
        try {
            JSONObject jsonObject = JSONObject.parseObject(deviceInfoFromHeader);
            return jsonObject.getString("app_version");
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 获取userId
     *
     * @return
     */
    public long getUserIdByToken() {
        try {
            PicaUser picaUser = this.getCurrentPicaUser();
            return picaUser.getId().longValue();
        } catch (Exception e) {
            e.printStackTrace();
            //todo:直接抛出异常
            throw new PicaException(PicaResultCode.LOGIN_FAIL);
        }
    }

    /**
     * 从token获取userId,如果获取不到则抛出异常
     *
     * @return
     */
    public long fetchUserIdByToken() {
        String token = this.getTokenFromHeader();
        if (StringUtils.isEmpty(token)) {
            throw new PicaException(PicaResultCode.LOGIN_FAIL);
        }
        return this.getUserIdByToken();
    }

    /**
     * 获取当前用户的角色
     *
     * @return
     */
    public List<PermissionRoleDto> getRoles() {
        long userId = this.getUserIdByToken();
        DoctorHospitalDto doctorHospitalDto = (DoctorHospitalDto) doctorServiceClient.getHospitalInfoById(userId).getData();
        if (doctorHospitalDto == null || doctorHospitalDto.getHospitalId() == null) {
            throw new PicaException("40000", "权限被拒绝");
        }
        List<PermissionRoleDto> roles = (List<PermissionRoleDto>) permissionServiceClient.getPermissionRoles(userId).getData();
        if (!CollectionUtils.isEmpty(roles)) {
            return roles;
        }
        return null;
    }

    /**
     * 发送短息
     */
    public void sendMessage(String mobile, String content, String senderId) {
        Map<Object, Object> map = new HashMap<>();
        map.put("mobileSmsEntityContentList", new ArrayList<>());
        map.put("sign", "sign");
        map.put("userId", senderId);
        map.put("batchNo", "batchNo");
        //todo:把集合转化成字符串
        String data = JSON.toJSONString(map);
        //进行发送短息的操作,发送一个网络请求
        //判断短信发送的结果
        String jsonObj = "";
        if (StringUtils.isEmpty(jsonObj)) {
            logger.info("发送短信成功,返回结果:{}", jsonObj);
        } else {
            logger.error("发送短信失败");
        }


    }
}

 

`BaseController` 在不同的框架或应用中可能有不同的含义和用途。在Web开发中,特别是在使用.NET MVC或类似框架的环境中,`BaseController` 通常是指一个基类控制器,用于封装公共的逻辑和属性,这样所有的子控制器都可以继承这个基类来复用代码。 例如,在ASP.NET MVC中,`BaseController` 可能会包含如用户认证、错误处理、日志记录等在多个控制器之间共享的方法和属性。这样,开发者就可以在`BaseController`中编写一次代码,然后让所有的子控制器都继承这些功能,从而减少重复代码,并保持代码的一致性。 在其他的应用中,`BaseController` 可能会被用作一个通用的处理层,提供对数据库、服务层或其他基础资源的访问接口。 具体到源码层面,`BaseController` 的实现会依赖于你正在使用的具体框架和业务需求。在源码中,你可能会看到类似以下结构的代码: ```csharp public class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { // 重写OnActionExecuting以实现请求执行前的逻辑 base.OnActionExecuting(filterContext); } protected override void OnActionExecuted(ActionExecutedContext filterContext) { // 重写OnActionExecuted以实现请求执行后的逻辑 base.OnActionExecuted(filterContext); } // 其他方法和属性定义... // 例如,一个简单的用户验证方法 protected bool AuthorizeUser() { // 进行用户验证的逻辑 return true; } } ``` 以上代码展示了一个简单的`BaseController`结构,实际应用中的`BaseController`可能会更加复杂和功能丰富。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值