SpringBoot报错“HttpRequestMethodNotSupportedException: Request method ‘GET‘ not supported“

异常

配置了登录拦截器后,访问/hello一个GET请求报错:

错误代码

出现本次错误的主要代码有两个类:

登录拦截器LoginInterceptor.java

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object user = request.getSession().getAttribute("user");
        if (user == null) {
            request.getRequestDispatcher("/login").forward(request, response);
            return false;
        }else {
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // Controller方法处理完之后,DispatcherServlet进行视图渲染之前;可以对ModelAndView进行操作
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // DispatcherServlet进行视图的渲染之后;多用于清理资源
    }
}

UserController.java

@Controller
public class UserController {
    @GetMapping("/")
    public String toLogin() {
        return "login";
    }

    @PostMapping("/login")
    @ResponseBody
    public String login( User user,HttpSession session) {
        session.setAttribute("user",user);
        System.out.println(user);
        return user.toString();
    }

    @GetMapping("/hello")
    @ResponseBody
    public String hello(){
        return "hello";
    }
}

原因

为什么"/hello"是一个GET方式的请求,但无法访问到呢?我们登录成功后再访问/hello是能够返回字符串"hello"的,但是如果没有登录则跳转到login.html页面,原意是这样的,但是代码却不是如此简单的。

查看拦截器类的代码,是如果没有登录则转发到"/login",但是我们查看控制器类的"/login",发现是一个POST请求,并且没有跳转到"login.html",所以应该是转发到"/"才会跳转到"login.html"页面,原来问题出现在这里。

解决

在拦截器中没有登录则转发到"/"请求中,则会跳转到login.html页面。

正确代码

那么在没有登录之前访问"/hello",就会转发到控制器类中的"/"请求,然后会跳转到login.html页面。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值