Java拦截器验证失败时返回Json格式数据

本文介绍了在Java Spring项目中,当Interceptor验证失败时如何返回Json格式的错误信息。主要内容包括添加FastJson依赖,Interceptor中调用自定义的token验证方法,并分析了使用FastJson与JSONObject在返回结果上的差异,建议使用FastJson以保持与@RequestBody相同的Json返回格式。

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


1、添加FastJson依赖

在pom.xml中添加如下依赖

<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>


2、在Interceptor中调用自定义方法

在interceptor判断token是否通过检验,否则调用TokenUtils类中的tokenDenied方法,往response中写入需要传回的信息,并return false。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse 		response, Object handler) throws Exception {
    boolean flag = false;

    // 获取token------
    String token = request.getHeader("Token");

    if(StringUtils.isNull(token)) {
        MyJsonResult.tokenDenied(response, "token为空");
        return false;
    }

    //token验证
    flag = TokenUtils.checkToken(token);

    //token验证失败
    if (!flag) {
        MyJsonResult.tokenDenied(response);
        return false;
    }

    return true;
}



上面的自定义方法,TokenUtils类中的tokenDenied方法

public static void tokenDenied(HttpServletResponse response) throws IOException {

    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/json; charset=utf-8");
    response.setStatus(HttpServletResponse.SC_OK);

    ObjectMapper mapper = new ObjectMapper();

    try {
        mapper.writeValue(response.getWriter(), JsonResult.error("token认证未通过"));
    }catch (Exception e) {
        e.printStackTrace();
    }
}



此时用PostMan测试到的返回结果

{
    "code": 0,
    "message": "token为空",
    "data": null
}


3、关于返回结果遇到的一些问题

开始并没有使用fastjson的ObjectMapper,用的是JSONObject,发现此时返回结果与@RequestBody返回的json结果有一些区别

{
    "code": 0,
    "message": "token为空"
}



当JSONObject传入的Obejct参数为空直接省略掉了改键值对,前端可能出现bug

public static void tokenDenied(HttpServletResponse response, String message) {

    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/json; charset=utf-8");
    response.setStatus(HttpServletResponse.SC_OK);

    PrintWriter writer = null;
    Object obj = null;
	
	//要返回的json信息
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("message", message);
    jsonObject.put("data", obj);
    jsonObject.put("code", 50002);

    try {
        writer = response.getWriter();
        writer.print(jsonObject);
        writer.close();
    }catch (IOException e) {
        e.printStackTrace();
    }
}



把Object obj = null; 改成了Object obj = new Object(); 后返回结果为

{
    "code": 0,
    "message": "token为空",
    "data": {}
}

所以推荐使用fastjson的ObjectMapper来作为返回结果,此时与@RequestBody返回的json结果一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值