springMVC拦截器返回错误信息给前端

墨蓝 2023-02-17 11:05 120阅读 0赞

springMVC拦截器的preHandle方法返回值是Boolean类型,所以条件够就放行,执行方法,而条件不足,前端无法知道是什么原因而被拦截,下面来解决这个问题。

一. 编写一个拦截器(该拦截器作用是:判断用户是否登录并且权限是否足够)

  1. package com.mmall.controller.common.intercept;
  2. import com.mmall.common.Constants;
  3. import com.mmall.common.ResponseCode;
  4. import com.mmall.common.ServerResponse;
  5. import com.mmall.pojo.User;
  6. import com.mmall.util.JsonUtil;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.web.servlet.HandlerInterceptor;
  9. import org.springframework.web.servlet.ModelAndView;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import javax.servlet.http.HttpSession;
  13. import java.io.PrintWriter;
  14. /** * @author Luyue * @date 2018/8/17 18:02 **/
  15. @Slf4j
  16. public class AuthorityTestIntercepter implements HandlerInterceptor {
  17. @Override
  18. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  19. HttpSession session = request.getSession();
  20. User user = (User) session.getAttribute(Constants.CURRENT_USER);
  21. if (user == null || user.getRole().intValue() != Constants.ROLE.ROLE_ADMIN) {
  22. return false;
  23. }
  24. log.info("preHandle");
  25. return true;
  26. }
  27. @Override
  28. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  29. }
  30. @Override
  31. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  32. }
  33. }

二. 注册该拦截器
在这里插入图片描述
具体拦截路径可以自行更改

三. 更改拦截器,返回信息给前端

不改变之前: 什么信息都没有
在这里插入图片描述
更改拦截器:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute(Constants.CURRENT_USER);
if (user == null || user.getRole().intValue() != Constants.ROLE.ROLE_ADMIN) {
//重置response
response.reset();
//设置编码格式
response.setCharacterEncoding(“UTF-8”);
response.setContentType(“application/json;charset=UTF-8”);

  1. PrintWriter pw = response.getWriter();
  2. if (user == null) {
  3. pw.write(JsonUtil.objToJson(ServerResponse.createByErrorCodeAndMessage(ResponseCode.NEED_LOGIN.getCode(), "拦截器拦截,请登录")));
  4. } else {
  5. pw.write(JsonUtil.objToJson(ServerResponse.createByErrorCodeAndMessage(ResponseCode.ERROR.getCode(), "拦截器拦截,无权限操作")));
  6. }
  7. pw.flush();
  8. pw.close();
  9. return false;
  10. }
  11. log.info("preHandle");
  12. return true;

}
效果:
在这里插入图片描述
这篇文章没有写全面,其中pw.write(JsonUtil.objToJson(ServerResponse.createByErrorCodeAndMessage(ResponseCode.NEED_LOGIN.getCode(), “拦截器拦截,请登录”)));
这句代码中JsonUtil.objToJson这个方法没有给出代码。
不过文章的思路可以参考。
可以把缺失的部分代码换成下面的代码。

  1. response.setCharacterEncoding("UTF-8");
  2. response.setContentType("application/json; charset=utf-8");
  3. PrintWriter out = null ;
  4. try{
  5. JSONObject res = new JSONObject();
  6. res.put("success","false");
  7. res.put("msg","xxxx");
  8. out = response.getWriter();
  9. out.append(res.toString());
  10. return false;
  11. }
  12. catch (Excepton e){
  13. e.printStackTrace();
  14. response.sendError(500);
  15. return false;
  16. }

以解决上面的问题。

参考文章:
https://blog.csdn.net/qq\_37585236/article/details/81781563
https://blog.csdn.net/u012201619/article/details/75156707/

发表评论

表情:
评论列表 (有 0 条评论,120人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringMVC:拦截

    简介: 拦截器本身并不重要,但在源码中很重要。 拦截器用于拦截请求,用于在处理器执行前进行预处理或者处理执行完进行尾处理。 其作用类似于过滤器,不同的是过滤器是ser

    相关 springmvc拦截

    1. springmvc拦截器使用和原理理解 1.1 作用 与struts2类似,springmvc的拦截器主要作用也是在服务端真正处理请求前后进行一些相关的操作