在多个页面需要执行统一执行的代码,可以通过过滤器的web组件来完成。。通过拦截request,也可以对返回的response进行拦截,做一些处理后再交给下一个过滤器或servlet处理。从而实现一些特殊的功能,例如权限访问控制、过滤敏感词汇等。
由于filter中的request,response 声明的是父类型,有些方法没有,需要转为子类型对象(实际就是子类对象,可以安全转换)
HttpServletRequest req = (HttpServletRequest)request; HttpServletResponse resp = (HttpServletResponse) response;post请求的中文乱码问题,可以采用字符编码过滤器来解决 req.setCharacterEncoding(“解码字符集”); req.getParameter()。
登陆检查过滤器 /* req.getRequestURI 排除一些特殊的路径
/user/insert.jsp 重定向到 index.jsp 如果没有加/ 是相对路径 http://localhost:8080/user/index.jsp
如果加了 / ,就是相对于主机名和端口号 也就是直接在路径前加 http://localhost:8080
结论:如果路径中有多层目录,建议以 / 写一个完整路径
cookie自动登陆过滤器 在 LoginServlet 中登录成功后,补充代码
// 如果勾选了 自动登录 String autoLogin = req.getParameter("autoLogin"); if(autoLogin != null && autoLogin.equals("true")) { Cookie cookie = new Cookie("up", username + ":" + password); cookie.setMaxAge(24 * 3600); resp.addCookie(cookie); }在 LoginFilter 过滤器中补充代码:
// 找到 up cookie Cookie[] cookies = req.getCookies(); Cookie up = null; for(Cookie c : cookies) { if (c.getName().equals("up")) { up = c; break; } } if(up != null) { String[] split = up.getValue().split(":"); String name = split[0]; String password = split[1]; // 验证cookie 用户名密码是否正确 User user = userDao.findByUsername(name); if(user!=null && user.getPassword().equals(password)) { // 正确了,向 session中存入登录标记并放行 req.getSession().setAttribute("username", username); chain.doFilter(req, resp); return; } }在注销时:
// 删除 自动登录 cookie Cookie up = new Cookie("up", ""); up.setMaxAge(0); resp.addCookie(up);