Filter过滤器(Servlet)
Filter,简单的说就是用来过滤从客户端发送到服务器端的信息。
创建Filter的过程:
1.创建一个类实现Filter接口:
public class MyFilter implements Filter
2.在配置文件中修改配置信息:
<filter> <filter-name>MyFilter</filter-name> <filter-class>com.filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
过滤器相关的配置和过滤链:
配置:
url-partern :指示在哪个位置进行拦截(过滤)
dispacher :包含四个内置属性:
ERROR:错误页面跳转
FORWORD:请求转发
INCLUDE:请求包含(页面中包含的文件)
REQUEST:请求request
过滤链:
FilterChain:将过滤器连接成一条链。放行方向为下一个过滤器,这个顺序是由在XML文件中filter-mapping的顺序决定的;如果没有下一个过滤器就指向服务器
应用:将Request请求信息进行过滤用来解决中文乱码问题
1.创建过滤器类:
package com.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; import javax.servlet.http.HttpServletRequest; public class MyFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //将request增强 //创建一个request的对象,因为这里是ServletRequest的request不能使用HTTPServletRequest的特有的传递doGet,doPost方法,所以要向下转型 HttpServletRequest req = (HttpServletRequest) request; SuperHttpServletRequest superRequest = new SuperHttpServletRequest(req); chain.doFilter(superRequest, response); } @Override public void destroy() { } }
2.创建重写类,重写getParameter方法,使得该方法加强
package com.filter; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class SuperHttpServletRequest extends HttpServletRequestWrapper { /** * 实现的是类而不是接口的好处:实现接口就要实现其所有的方法 * 而类只需要重写就行了,因为继承类的话会自动继承父类的所有方法 * ServletRequest是顶层接口,里面定义了getParameter方法,而HttpServletRequestWrapper是第一个实现该接口 * 所有方法的类,所以直接继承该类重写方法就行了 */ private HttpServletRequest request; public SuperHttpServletRequest(HttpServletRequest request) { super(request); //将父类中的request赋值给该类中的request this.request=request; } @Override public String getParameter(String name) { //获取请求方式 String method = request.getMethod(); //如果是get请求,get请求的解决中文乱码的方式是用utf-8重构字符串 if("get".equalsIgnoreCase(method)) { String parameter = super.getParameter(name); try { parameter = new String(parameter.getBytes("ISO-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return parameter; //如果是post请求,post请求解决中文乱码的方式是重新设置字符缓冲区的编码格式 }else if("post".equalsIgnoreCase(method)) { try { request.setCharacterEncoding("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return request.getParameter(name); } }