Filter即过滤器,是servlet中最实用的技术,可以对web服务器管理的所有web资源进行拦截,从而实现特殊功能;主要用于对用户请求进行预处理,也可以对httpServletResponse进行后处理;完整流程:Filter对用户请求进行预处理,接着将请求交给servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理
过滤器相关API
interface Filter 过滤器核心接口
void init(filterconfig)初始化方法,服务器启动时执行;void doFilter(request,response,filterchain) 过滤器拦截的业务处理方法;void destroy() 销毁过滤器实例是调用
interface FilterConfig 获取初始化参数信息
interface FilterChain 过滤器链参数,一个个过滤器形成一个执行链
过滤器编码统一处理
public class EncodingFilter implements Filter { @Override public void destroy(){} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //转型 httpservletrequest是servletrequest的子类,多了针对于http协议的方法 final HttpServletRequest req = (HttpServletRequest) request; final HttpServletResponse rep = (HttpServletResponse) response; //公用业务处理 req.setCharacterEncoding("utf-8"); //设置post提交的请求的编码 req.setCharacterEncoding("utf-8"); //设置响应体的编码 rep.setContentType("text/html;charset=utf-8"); //设置页面打开时的编码格式,设置响应体的编码 //get中文乱码,request.getparameter方法内部没有进行提交方式判断和处理,使用代理处理 HttpServletRequest proxy = (HttpServletRequest) Proxy.newProxyInstance( req.getClass().getClassLoader(), //指定当前使用的类加载器 new Class[] {HttpServletRequest.class}, //对目标对象实现的接口类型 new InvocationHandler() //事件处理器 { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //定义方法返回值 Object returnValue = null; //获取方法名 String methodName = method.getName(); //判断:对getparameter方法进行get提交中文处理 if("getParameter".equals(methodName)){ //获取请求数据值 String value = req.getParameter(args[0].toString()); //获取提交方式 String methodSubmit = req.getMethod(); //如果是get提交,对数据进行处理 if("GET".equals(methodSubmit)){ if(value != null && "".equals(value.trim())){ value = new String(value.getBytes("IS08859-1"),"UTF-8"); } } return value; }else{ returnValue = method.invoke(req, args); } return returnValue; } }); //传入代理对象,执行下一个过滤器或者servlet chain.doFilter(proxy, rep); } @Override public void init(FilterConfig filterConfig) throws ServletException{} }
无效数据过滤
登录权限判断