SpringMVC 登录注册中拦截器遇到的问题 注销后的第一次访问主页面,没进行拦截

 

    <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/user/log/*"/>
            <mvc:exclude-mapping path="/login.html"/>
public class InterceptorTest implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//        /* 完成登录拦截器的功能 如果在Session中没有登录用户,则跳转到登录界面 */
        Object user = httpServletRequest.getSession().getAttribute("loginUser");
        System.out.println("preHandle方法 判断user");
        if (null == user) {
            //  redirect(httpServletRequest, httpServletResponse);
            httpServletResponse.sendRedirect("login.html");
            return false;
        }//如果return值为true,则允许继续执行 return true;
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法 ");
        // System.out.println("postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion方法");
        //  System.out.println("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");
    }

上面是拦截器代码

 

接下来是遇到的问题:

不管哪种方式,注销以后的第一次访问main.html都没进拦截器,还可以访问;

再次刷新就开也进行拦截了

在main.html里面注销的 ,访问其他正常拦截

 

第一种 方式

控制层

@RequestMapping("logout")
    public String log(User user, HttpServletRequest httpServletRequest) {
        httpServletRequest.getSession().invalidate();
        httpServletRequest.getSession().removeAttribute("loginUser");
        return "redirect:/login.html";
    }

main界面

 <li><a href="user/logout"> 退出系统</a></li>

第一种 虽然main界面再次可以进去,但是注销按钮点击不了,只要点 了 控制台就一直打印这个在prehandle方法中的语句。刷新界面后拦截器又可以了

preHandle方法 判断user
preHandle方法 判断user
preHandle方法 判断user
preHandle方法 判断user
preHandle方法 判断user

第二种 

   @ResponseBody
    @RequestMapping("logout")
    public Boolean login2(User user, HttpServletRequest httpServletRequest) {
        httpServletRequest.getSession().removeAttribute("loginUser");
        return  true;

    }

mian界面

<li><a onclick="logout()"> 退出系统</a></li>
 <script>
         function logout(){
                 $.ajax({
                     url:"user/logout",
                     type:"post",
                     success:function (data) {
                             window.location.href = "login.html";
                     }
                 });
         }
      </script>

第二种 用ajax请求也有这个问题 ,又正常了。。。刚刚还不行,有人能看出问题吗

 

 

会不会你配置了多个拦截器?

写代码不要用log,login2,xxxTest这样的命名,容易引起歧义

可以参考这篇文章检查一下: https://segmentfault.com/a/1190000015642264

试了无数次后,发现问题所在

虽然不会解释,有人解释一下不

  • 下面这个是错误的代码

 @RequestMapping("logout")
 public String log(User user, HttpServletRequest httpServletRequest) {
    httpServletRequest.getSession().invalidate();
    httpServletRequest.getSession().removeAttribute("loginUser");
    return "redirect:/login.html";
  }
 <li><a href="user/logout"><i class="glyphicon glyphicon-off"></i> 退出系统</a></li>
  • 自我感觉问题出现在

    使用 @RequestMapping注解返回String后 return "redirect:/login.html"这里出现的问题

    还是有点不懂

    这里和过滤器有什么关系。。。

下面这个是运行正常的

  @ResponseBody
    @RequestMapping("logout")
    public Boolean login2(User user, HttpServletRequest httpServletRequest) {
        httpServletRequest.getSession().removeAttribute("loginUser");
        return  true;

    }
    <script>
         function logout(){
                 $.ajax({
                     url:"user/logout",
                     type:"post",
                     success:function (data) {
                     window.location.href = "login.html";

                     }
                 });
         }
      </script>
	<li><a onclick="logout()"><i class="glyphicon glyphicon-off"></i> 退出系统</a></li>