异常
配置了登录拦截器后,访问/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页面。