过滤器与监听器基本使用

mac2022-06-30  27

一、过滤器(Filter)

(一) 概念

在多个页面需要执行统一执行的代码,可以通过过滤器的web组件来完成。。通过拦截request,也可以对返回的response进行拦截,做一些处理后再交给下一个过滤器或servlet处理。从而实现一些特殊的功能,例如权限访问控制、过滤敏感词汇等。

(二) 定义过滤器

@WebFilter(urlPattern="要过滤哪些路径") class 过滤器类 implements Filter{ // 初始化操作 public void init() { } // 销毁操作 public void destroy() { } // 过滤方法 子类对象 子类对象 过滤器链 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain ) throws ... { // 要统一执行的代码 //chain.doFilter(request, response); // 调用此方法,让请求继续前进 } }

(三) 过滤器路径格式

精确匹配 /servlet1 , 只会进入servlet1之前进入过滤器后缀匹配 *.jsp , 只要请求的后缀是 jsp 结尾的,就会进入过滤器前缀匹配 /user/* , 例如 /user/insert /user/update, 都会经过此过滤器只要过滤器的路径与目标路径匹配,这个过滤器就会被执行,因此,在请求前进的过程中会经过多个过滤器过滤器经过的顺序和过滤器的名字有关,按字母先后顺序排列。

(四) request和response的类型转换

由于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);

二、监听器(Listener)

(一) 概念

监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等。Listener 没有路径,特定事件发生时,会执行监听器代码

(二) 常用的一些监听器

初始化和销毁时 ServletRequestListener 在请求对象初始化和销毁时HttpSessionListener 在 session 对象创建后和销毁时ServletContextListener application 对象创建和销毁时 作用域变量发生改变时 ServletRequestAttributeListener 请求中作用域变量发生改变时HttpSessionAttributeListener session 中作用域变量发生改变时ServletContextAttributeListener application 中作用域变量发生改变时 HttpSessionActivationListener 在session 钝化(内存存入磁盘)和活化(从磁盘恢复到内存) session 中存储对象,对象要实现 Serializable 接口HttpSessionBindingListener
最新回复(0)