在做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()过。于是认为这是使用逻辑混乱,果断报错。