主要内容
过滤器
监听器
过滤器
- FIlter即为过滤,用于Servlet之外对Request或者Response进行修改,对用户请求预处理,对Response进行后处理
- 作用,例如,之前post方法可能会出现中文请求乱码,需要在servlet中一个一个设置中文格式,现在可以在filter中进行统一的处理。可以将一些对所有servlet执行的操作放在此处执行。
- 使用Filter的完整流程,Filter对用户请求进行预处理,接着将请求交给Servlet进行处理生成响应,最后Filter再对服务器数据进行后响应处理。可以并发编写多个Filter,这些Filter称之为Filter链。
过滤器和监听器主要内容 -
过滤器和监听器主要内容 - 过滤器的实现
/**
* 过滤器的实现
* 1:创建java类
* 2,实现Filter接口
* 3.实现方法
* 4 设置需要被过滤的资源
* 拦截的资源 @WebFilter("/s1")
*
*/
@WebFilter("/s1")
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter 1 ");
}
@Override
public void destroy() {
}
}
- 上述代码中只是实现了过器,因为没有放行资源,所以请求会被拦截,设置放行资源
//对request请求进行预处理
//放行资源
filterChain.doFilter(servletRequest,servletResponse);
// 对response响应进行后处理
- 过滤器执行的顺序
- 客户端发起请求,过滤器1,过滤器2,资源,过滤器2,过滤器1,客户端。
- 过滤器类在前面先执行(字母顺序)
- 解决问题
- 解决乱码问题实战
- 首先,新建个提交表单页面,test_filter.jsp
<body>
<form action="s1" method="post">
姓名:<input type="text" name="uname"><button>提交</button>
</form>
<form action="s2" method="post">
姓名:<input type="text" name="uname"><button>提交</button>
</form>
</body>
- 在filter中设置中文格式
- 因为doFilter的格式是ServletRequest,而请求是httpservlet的,所以要先转换。
//处理请求乱码问题
// 基于HTTp请求
HttpServletRequest request = (HttpServletRequest)servletRequest;
request.setCharacterEncoding("utf-8");
用来做用户的非法访问拦截
监听器
- 介绍:监听器是一特殊的Servlet类,监听特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁,变量的创建,销毁和修改等例如统计在线人数
- 实现
- 监听生命周期
- ServletRequestListener
- HttpSessionListener
- ServletContextListener
- 监听值的变化
- ServletRequestAttributeLIstener
- HttpSessionAttributeListener
- ServletContextAttributeListener
- 针对session中对象
- 坚听session中的java对象(javabean),javabean直接实现监听器中的接口
实现
- 实现需要坚听的接口
- 在类名上添加注解@WebListener
示例:
- 统计在线人数
- 设计思路:根据session人数来得出在线人数的数量
- 技术点:需要从onlinelistener实现HttpSessionListener的接口,使用变量来统计人数。想显示人数需要在servlet页面显示,所以建立个onlineServlet,涉及到一个从listener接口向servlet传递数据的操作,无法直接获得,所以考虑使用Sessio作用域来传递数据。