1.session验证
可以防止非登录的用户,通过在地址栏中输入地址,访问受保护的页面
step1.在用户登录成功之后,将用户的信息保存到session中
step2.在访问受保护的页面时,校验session中是否包含用户的信息
2.session删除
session.invalidate();
request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); //获取请求资源路径 String uri=request.getRequestURI(); //截取 /list String action=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf(".")); AdminDAO dao=(AdminDAO)DAOFactory.getInstance("AdminDAO"); if("/list".equals(action)){ //session校验 HttpSession session=request.getSession(); Object obj=session.getAttribute("admin"); if(obj==null){ //登录失败 response.sendRedirect("login.jsp"); return; } //获取集合数据 try { // 人为制造异常 // String str=null; // str.length(); List<Admin> list=dao.finAll(); //将数据转交给jsp展示 //转发 request.setAttribute("list", list); request.getRequestDispatcher("list.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //将异常信息记录到日志里面 //将异常往外抛 throw new ServletException(e); } }else if("/add".equals(action)){ String username=request.getParameter("username"); String password=request.getParameter("password"); String realname=request.getParameter("realname"); Admin admin=new Admin(username,password,realname); try { dao.add(admin); response.sendRedirect("list.do"); } catch (Exception e) { e.printStackTrace(); throw new ServletException(e); } }else if("/del".equals(action)){ int id=Integer.parseInt(request.getParameter("id")); try { dao.del(id); response.sendRedirect("list.do"); } catch (Exception e) { e.printStackTrace(); throw new ServletException(e); } }else if("/load".equals(action)){ int id=Integer.parseInt(request.getParameter("id")); try { Admin admin=dao.findById(id); //转发 request.setAttribute("admin", admin); request.getRequestDispatcher("update.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); throw new ServletException(e); } }else if("/update".equals(action)){ int id=Integer.parseInt(request.getParameter("id")); String username=request.getParameter("username"); String password=request.getParameter("password"); String realname=request.getParameter("realname"); Admin admin=new Admin(id,username,password,realname); try { dao.update(admin); response.sendRedirect("list.do"); } catch (Exception e) { e.printStackTrace(); throw new ServletException(e); } }else if("/login".equals(action)){ //获取用户验证码 String userCode=request.getParameter("userCode"); //获取账号及密码 //获取session HttpSession session=request.getSession(); String username=request.getParameter("username"); String password=request.getParameter("password"); //校验 //验证正确的验证码 String rightCode=(String)session.getAttribute("rightCode"); if(!rightCode.equalsIgnoreCase(userCode)){ //验证失败 request.setAttribute("code_msg", "验证码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); return; } try { Admin admin=dao.findByUserName(username); if(admin!=null&&admin.getPassword().equals(password)){ //登录成功 //将用户的信息保存到session上 session.setAttribute("admin", admin); response.sendRedirect("list.do"); }else{ //登录失败 request.setAttribute("login_msg", "账号或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } } catch (Exception e) { e.printStackTrace(); throw new ServletException(e); } }else if("/logout".equals(action)){ //session删除 //重定向到登录页面 HttpSession session=request.getSession(); session.invalidate(); response.sendRedirect("login.do"); } out.close(); }
3.URL重写
为什么需要URL重写?
因为sessionId是依赖于cookie的机制保存在浏览器内存中,那么当用户禁止cookie之后,如何继续使用cookie?
解决方案:URL重写
如何重写?
链接,表单:
response.encodeURL("count"); <form action="<%=response.encodeURL(count)%>"> </form>
重定向:
response.encodeRedirectURL("地址");
转发:不需要(一次交互)
4.cookie与session区别:
cookie:将数据保存在客户端
session:将数据保存在服务器
session优势:
a.session保存的数据类型更宽泛
b.session保存的数据量更大
c.session更安全
session缺点
a.sessionId是保存在浏览器内存中,浏览器一旦关闭,内存空间被释放,sessionId消失。
b.服务器会为每一个用户分配一个session对象,而session是保存在服务器端,当用户较大时,对服务器的压力响应增加,而cookie是保存在浏览器端,理论上对服务器没有压力。
应用场景:
session:登录拦截(session验证)、验证码校验
cookie:自动登录
5.过滤器
过滤器是servlet规范当中的一个特殊的类,可以用来对servlet请求进行拦截并处理。
如何定义一个过滤器
step1.定义一个Java类,实现一个Filter接口
step2.重写接口中的方法
step3.在web.xml文件中配置过滤器
练习:写一个过滤器ProcessFilter2,判断评论的长度是否超过指定的范围(比如:长度限制不能超过20)
分析:当有多个过滤器符合过滤条件时,它们的执行顺序与什么有关?
与web.xml文件中<filte-mapping>的配置有关。
优势:
a.当多个web组件有相同的功能需要实现时,可将这部分逻辑封装到过滤器中,方便后期维护
b.可"插拔性"比较好,当增加或者减少一个功能时,不会影响已经存在的功能。
应用场景:登录拦截、IP过滤