getWriter() has already been called for this response

在做jwt token校验的时候遇到了该错误。源码如下:

package com.highway.determination.config;

import com.alibaba.fastjson.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.highway.determination.enums.ConstantsEnum;
import com.highway.determination.response.Result;
import com.highway.determination.utils.MessageDigestUtil;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.TimeUnit;

import static com.highway.determination.constant.AppConstant.AUTHORIZATION;
import static com.highway.determination.enums.ConstantsEnum.NO_TOKEN;

@Component
public class AuthenticationInterceptor implements HandlerInterceptor {

    @Resource
    private RedisTemplate<String,String> redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            String token = request.getHeader(AUTHORIZATION);

            PrintWriter writer = getStandardPW(response);
            if (StringUtils.isEmpty(token)){
                writer.append(JSON.toJSONString(Result.error(NO_TOKEN.getCode(),NO_TOKEN.getDes())));
                return false;
            }

            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(MessageDigestUtil.SALT)).build();
            DecodedJWT decodedJWT = verifier.verify(token);
            Long userId = decodedJWT.getClaim("userId").asLong();
            String key = "user:token:"+userId;
            redisTemplate.expire(key,30, TimeUnit.MINUTES);
            return true;
        }catch (Exception e){
            return false;
        }
    }

    private PrintWriter getStandardPW(HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        return response.getWriter();
    }
}

这里提前获取了PrintWriter,然后返回了true。servlet再次通过response输出流将返回值向客户端发送时,发现输出流已经被调用过,也就是getWriter()过。于是认为这是使用逻辑混乱,果断报错。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容