今晚有做过一个登录验证,即防止用户跳过登录页面直接访问内部资源。
原理:设置过滤器Filter,对每次请求判断:是否有cookie (user, id), 若有,是否此cookie和session中所存储对象id一致。若无cookie或不一致,则重定向跳转回登录或注册页面。
中间一直存在一个问题,即设置了cookie且可以在浏览器中查到,但是后台始终无法getCookie,原因如下:
Cookie的默认作用域为当前应用请求中,默认不设置path的时候,只会在请求和servlet同路径的情况下才会携带cookie中存储的数据,包含同级目录和下级目录。
例如,我的登录页面为shop/login.jsp , 因此同级目录为shop. 而我在Controller中shop/user/logIn 中添加的cookie, 因此同级目录为shop/user。因此Cookie只在shop/user下有效,而在shop/下无效。每次访问其他资源或登录完成后重定向跳转其他资源如index.jsp时,其路径为shop/index.jsp,并不在shop/user下,因此无效。
所以,请切记添加cookie.setPath()来指定路径,
- cookie.setPath(“/”) 即为全路径
- cookie.setPath(“/shop/") 即为项目目录下,因此shop/index.jsp可以使用cookie。
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/logIn")
public void logIn(HttpServletRequest request, HttpServletResponse response, User user) throws IOException {
User result = userService.logIn(user);
ModelAndView mv = new ModelAndView();
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
if (result != null){
HttpSession session = request.getSession();
session.setAttribute("user", result);
Cookie cookie = new Cookie("user", String.valueOf(result.getId()));
cookie.setPath("/");
response.addCookie(cookie);
writer.write("{\"msg\":\"true\"}");
}
else {
writer.write("{\"msg\":\"false\"}");
}
}
}