forward 和 redirect在Spring MVC和Spring Boot中的使用

使用场景

在接口开发过程中,在Controller层实现供前端调用的接口开中时,有时一个功能已经在其他Controller中实现过,如在该Controller中重复实现一遍会造成代码冗余,不是推荐的方案?那怎么做到让前端开发人员看着比较方便一点儿,而后端又不会产生冗余呢?这里推荐在Controller中使用forward实现。

具体实现

这里举一个例子,比如MbrMemberCtroller中已经实现了对会员详情的获取,而此时需要开发一个订单的Controller,命名为OsmServiceOrderController,在这个Controller中需要获取供应方会员的详细信息(即 MbrMemberCtroller中已实现的会员详情),怎么实现呢?

原始Controller实现

MbrMemberCtroller

@ApiOperation(value = "获取会员详情", notes = "获取会员详情。", response = MbrMember.class, authorizations = {@Authorization(value="apikey")})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "mbrMemberId", value = "会员编号", required = true, dataType = "string", paramType = "query")
    })
    @Log("明细会员信息记录表")
    @PostMapping("detail/{mbrMemberId}")
    @RequiresPermissions("mbrMember:detail")
    public MbrMember detail(@NotBlank(message = "{required}") @PathVariable String mbrMemberId) throws FebsException {
        try {
            return this.iMbrMemberService.selectMbrMemberDetail(mbrMemberId);
        } catch (Exception e) {
            message = "明细会员信息记录表失败";
            log.error(message, e);
            throw new FebsException(message);
        }
    }

注意上述两个Api的注解用于生成Swagger接口文档,@RequiresPermissions是对接口调用权限的控制,与此处重点无关。

这是一个post请求方式实现的接口。

调用方Controller实现

@ApiOperation(value = "明细需求方", notes = "需求方明细信息。", response = String.class, authorizations = {@Authorization(value="apikey")})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "mbrMemberId", value = "会员信息编号", required = true, dataType = "string", paramType = "query")
    })
    @Log("明细订单表")
    @PostMapping("demanderDetail/{mbrMemberId}")
    @RequiresPermissions("mbrMember:detail")
    public void demanderDetail(@NotBlank(message = "{required}") @PathVariable String mbrMemberId,
                               HttpServletRequest req, HttpServletResponse resp) throws FebsException {
        try {
            req.getRequestDispatcher("/mbrMember/detail/" + mbrMemberId).forward(req, resp);
        } catch (Exception e) {
            message = "代理明细需求方信息失败";
            log.error(message, e);
            throw new FebsException(message);
        }
    }

这里采用Request来直接调用forward的实现方式。

forward(请求转发)只能用在同一个应用中,而redirect可以重定向到其他外部应用中去。此处是在同一个应用中的实现,且带有参数,并且需要返回结果集,故使用forward方式更为合适。

参考资源

https://blog.csdn.net/u011676300/article/details/79657933