JAVA(filter):过滤器。
Filte是JavaWeb的三大web组件之一Servlet、Filter、Listener 。
它的作用是在请求到达WEB资源(HTML、CSS、Servlet、JSP)之前进行拦截
需要交给Tomcat访问器来管理。
Filter的作用:
在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
大概流程:
客户端发出request,过滤器进行拦截处理后,将request发送给servlet,然后servlet将给的request处理后 response给过滤器,过滤器response给客户端。
过滤器中的执行顺序:
当我们为一个资源设置了多个过滤器时,这些过滤器就组成一个Filter链的结构。
当我们去掉用chain.doFilter(),如果该过滤器后边还有其他的过滤,
相当于调用了下一个过滤器doFilter()方法
如果过滤器后没有其他的过滤器,我们调用chain.doFilter()
相当于调用了目标资源的service()方法。
注意:
多个Filter的执行顺序,有filter-mapping标签的配置顺序决定,
filter-mappint靠前,则filter先执行,靠后则后执行。
我们可以通过修改filter-mapping的顺序来修改Filter的执行顺序,
但是注意,filter-mapping不能写在filter标签的前边。
创建完成后默认代码,可以看到,CharsetFilter实现了Filter接口,实现了3个方法。3个方法的作用已经在注释中写清楚了。
package com.alex.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 来解决
POST 请求中文乱码问题
* 拦截器的作用
* 解决那些问题:
* 密码加密
* 对请求参数值进行非法字符过滤
* 权限控制
* 登陆验证
*/
public class CharacterEncodingFilter
implements Filter{
String filename;
@Override
public void destroy() {
System.out.println("destroy... ...");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("doFilter 前... ...")
request.setCharacterEncoding("UTF-8");//重复性代码
//这个编码设置,一定是获取输出流之前,在获取输出流之后在设置就不管用了
response.setContentType("text/html;charset=UTF-8");
chain.doFilter(request,
response);//放行- 执行后续过滤器,执行目标程
//狸猫换太子
String name = (String)request.getAttribute("name");
request.setAttribute("name",name + "22");
System.out.println("doFilter 后 ... ...");
}
//获取web.xml中filter配置的初始化参数
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init... ...");
filename= filterConfig.getInitParameter("filename");
}
}
配置初始化参数,跟Servlet配置一样
initParams = {
@WebInitParam(name = "key",value = "value")
}
dispatcherTypes
配置拦截的类型,可配置多个。默认为DispatcherType.REQUEST:
dispatcherTypes = {DispatcherType.ASYNC,DispatcherType.ERROR}
FORWARD,//转发的
INCLUDE,//包含在页面的
REQUEST,//请求的
ASYNC,//异步的
ERROR;//出错的
当服务器一启动就会执行Filter的init(FilterConfig config)方法,然后创建一个过滤器,创建一个实例。当Filter被移除或服务器正常关闭时,会执行destroy方法。