学习笔记——javaWeb过滤器
过滤器是一个服务器端组件,它可以截取用户端的请求与相应信息,并对这些信息过滤。
简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。
根据过滤器在Web.xml中的设置,特定的网址会经过特定的过滤器。随后通过过滤器的处理,再将处理过的用户请求发送至web资源,资源响应之后再发送到过滤器,过滤器再处理之后,才发送给用户。
具体处理过程:多个过滤器的情况下,会先执行第一个过滤器chain.doFilter()前的代码,然后doFilter()到达第二个过滤器。第二个过滤器也会先执行chain.doFilter()前的代码,然后doFilter()到达Servlet.service()方法。之后在返回过滤器2doFilter()之后的代码,在返回过滤器1doFilter()之后的代码,最后才返回用户。3.如何编写一个简单过滤器
3.1过滤器的三个主要方法
编写过滤器之前,先熟悉一下过滤器的三个主要方法:3.2 继承 javax.servlet.Filter
开始编写第一步:继承public class MyFirstFilter implements javax.servlet.Filter3.3 重写doFilter
第二步:重写
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException { //你的代码 chain.doFilter(req, resp); }3.4 注册Filter
第三步:注册4.过滤器的分类
过滤器根据其处理的请求类别,分为5类。Servlet2.5中定义了request,Forward,Include,Error四类,而Servlet3.0中定义了第5类:Async。下图中的RequestDispatcher的forward方法等于<jsp:forward>方法,同理,include等于<jsp:include>方法。第5类,Async用于通过过滤器访问的Servlet有大量耗时操作时,可直接回到过滤器chain.doFilter()之后的代码运行,让Servlet异步运行计算操作。5.过滤器的应用
1.登录验证1.1将过滤器的url地址设为“/*”<filter-mapping> <filter-name>MyFirstFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>1.2查看session中是否有登录名public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; HttpSession session = request.getSession(); String username = (String) session.getAttribute("username"); if ("".equals(username) || username == null) { response.sendRedirect("login.jsp"); } chain.doFilter(req, resp); }2.编码 转换在过滤其中添加以下语句:request.setCharacterEncoding("UTF-8");6.过滤器的其他问题
1.过滤器能否改变用户请求的资源,即改变用户请求的路径?答:可以的。过滤器可通过,request.sendRedirect()方法或response.getDispatcher().forWord()方法改变用户请求的路径。2.过滤器能否直接诶返回数据?答:不能。
新闻热点
疑难解答