Jeecg-Boot 开发经验积累

1、排除token验证

如下图,访问自己写的接口无效。提示token失效


image.png

我们可以找到这个ShiroConfig.java类,将以下注册 jwt 的代码注释掉,如下图

image.png

注意这种方法会让获得用户失效,只会获得null。这样像一些授权操作就会失效了。然后提示没有权限请联系管理员

2、前端是如何传token到后端的?

抓取一个请求,可以看到有一个名为X-Access-Token的Request headers


image.png
3、在controller上使用 @RequiresRoles("admin")

直接访问则会报错如下,只有当前用户的角色是admin的情况下才能访问


image.png

再来看org.jeecg.common.exception.JeecgBootExceptionHandler这个类,是全局异常处理器,里面有这个方法。即是它截获了UnauthorizedException.class, AuthorizationException.class两个异常。然后在这里处理


image.png

如果要正常访问被这个注解所修饰的接口,那么请不要按照第一步的方式注释掉那段代码。

然后将已经登录admin账户后的浏览器请求的的这段信息copy下来


image.png

粘贴到postman里,带上token后请求即可!


image.png
4、获得当前用户

1、直接获取,注意若不传token则获取的将是null

LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
System.out.println(sysUser);

2、或者使用根据token获取用户信息

    //username账号是唯一的
        String username = JwtUtil.getUsername(TokenUtils.getTokenByRequest(request));
        // 查询用户信息
        LoginUser user = sysBaseAPI.getUserByName(username);
5、打印sql

application-dev.yml文件

#Mybatis输出sql日志,keyi1
logging:
  level:
    org.jeecg.modules.system.mapper : debug
    org.jeecg.modules.app.mapper: debug
  

这个org.jeecg.modules.app.mapper包是我们创建的包

再配合mybatis-log-plugin插件即可完成打印真实sql

6、使用原生sql进行分页查询

mapper

    @Select("SELECT * FROM tb_user where name LIKE  concat('%',#{name},'%') ")
    List<TUser> queryPage(Page<TUser> page,@Param("name") String name);

TUserService

  Page<TUser> queryPage(Page<TUser> page, TUser tUser);

TUserServiceImpl

 @Override
    public Page<TUser> queryPage(Page<TUser> page, TUser tUser) {
        return page.setRecords(baseMapper.queryPage(page,tUser.getName()));
    }

TUserController

@AutoLog(value = "测试-分页")
    @ApiOperation(value = "测试-分页", notes = "测试-分页")
    @RequestMapping(value = "/getListFy", method = RequestMethod.GET)
    public Result<?> getListFy(TUser tUser,
                               @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                               @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
        Result<Page<TUser>> result = new Result<>();
        Page<TUser> page = new Page<>(pageNo, pageSize);
        page = tUserService.queryPage(page,tUser);//通知公告消息
        log.info("查询当前页:" + page.getCurrent());
        log.info("查询当前页数量:" + page.getSize());
        log.info("查询结果数量:" + page.getRecords().size());
        log.info("数据总数:" + page.getTotal());
        result.setSuccess(true);
        result.setResult(page);
        return result;
    }
7、接口文档

http://localhost:8080/jeecg-boot/swagger-ui.html#/

8、从库中表导入到表单的单独数据库连接

这个配置的链接库和springboot连接库是分开的
jeecg_database.properties

9、对于系统中的org.jeecg.common.api.vo.Result类

请不要添加lombok的 @Accessors(chain = true) 虽然写起来很舒服,但是加上这个表单预览页面就报错了~

所以还是请这样写:

Result<Object> ok = Result.ok(tbBox);
        ok.setMessage("操作成功");
        return ok;
10、全局异常处理,自定义返回响应状态码 2020/5/10 22:38

JeecgBootException 类有两处修改:
1、添加status字段,加上set和get
2、添加一个构造器,传入status

package org.jeecg.common.exception;

public class JeecgBootException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    /**
     *@description: 自定义状态
     *@author: yinkai
     *@create: 2020/5/10 22:35
     */
    private Integer status;
    public Integer getStatus() {
        return this.status;
    }
    public void setStatus(final Integer status) {
        this.status = status;
    }

    public JeecgBootException(String message){
        super(message);
    }
    
    public JeecgBootException(Throwable cause)
    {
        super(cause);
    }

    
    public JeecgBootException(String message,Throwable cause)
    {
        super(message,cause);
    }

    /**
     * 添加一个构造器,传入status
     * @param message
     * @param status
     * @param cause
     */
    public JeecgBootException(String message,Integer status, Throwable cause)
    {
        super(message,cause);
        this.status = status;
    }
}

JeecgBootExceptionHandler异常处理类修改

package org.jeecg.common.exception;

import io.lettuce.core.RedisConnectionException;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.UnauthorizedException;
import org.jeecg.common.api.vo.Result;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.redis.connection.PoolException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.NoHandlerFoundException;

import lombok.extern.slf4j.Slf4j;

/**
 * 异常处理器
 * 
 * @Author scott
 * @Date 2019
 */
@RestControllerAdvice
@Slf4j
public class JeecgBootExceptionHandler {

    /**
     * 处理自定义异常
     */
    @ExceptionHandler(JeecgBootException.class)
    public Result<?> handleRRException(JeecgBootException e){
        log.error(e.getMessage(), e);
        /**
         *@description: 根据状态码构造
         *@author: yinkai
         *@create: 2020/5/10 22:38
         */
        return  e.getStatus()==null? Result.error(e.getMessage()): Result.error(e.getStatus(),e.getMessage());
    }

    @ExceptionHandler(NoHandlerFoundException.class)
    public Result<?> handlerNoFoundException(Exception e) {
        log.error(e.getMessage(), e);
        return Result.error(404, "路径不存在,请检查路径是否正确");
    }

    @ExceptionHandler(DuplicateKeyException.class)
    public Result<?> handleDuplicateKeyException(DuplicateKeyException e){
        log.error(e.getMessage(), e);
        return Result.error("数据库中已存在该记录");
    }

    @ExceptionHandler({UnauthorizedException.class, AuthorizationException.class})
    public Result<?> handleAuthorizationException(AuthorizationException e){
        log.error(e.getMessage(), e);
        return Result.noauth("没有权限,请联系管理员授权");
    }

    @ExceptionHandler(Exception.class)
    public Result<?> handleException(Exception e){
        log.error(e.getMessage(), e);
        return Result.error("操作失败,"+e.getMessage());
    }
    
    /**
     * @Author 政辉
     * @param e
     * @return
     */
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public Result<?> HttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e){
        StringBuffer sb = new StringBuffer();
        sb.append("不支持");
        sb.append(e.getMethod());
        sb.append("请求方法,");
        sb.append("支持以下");
        String [] methods = e.getSupportedMethods();
        if(methods!=null){
            for(String str:methods){
                sb.append(str);
                sb.append("、");
            }
        }
        log.error(sb.toString(), e);
        //return Result.error("没有权限,请联系管理员授权");
        return Result.error(405,sb.toString());
    }
    
     /** 
      * spring默认上传大小100MB 超出大小捕获异常MaxUploadSizeExceededException 
      */
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public Result<?> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        log.error(e.getMessage(), e);
        return Result.error("文件大小超出10MB限制, 请压缩或降低文件质量! ");
    }

    @ExceptionHandler(DataIntegrityViolationException.class)
    public Result<?> handleDataIntegrityViolationException(DataIntegrityViolationException e) {
        log.error(e.getMessage(), e);
        return Result.error("字段太长,超出数据库字段的长度");
    }

    @ExceptionHandler(PoolException.class)
    public Result<?> handlePoolException(PoolException e) {
        log.error(e.getMessage(), e);
        return Result.error("Redis 连接异常!");
    }

}

使用如下,指定状态码为201

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public Result test(HttpServletRequest request) {

        try {
            int i = 1 / 0;
        }catch (Exception e){
            throw new JeecgBootException("除0异常",201,e);
        }
        return Result.ok();

    }

执行效果:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352