<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>