一,什么是过滤器?
JavaWeb三大组件之一.
Filter,与Servlet很相似,不过过滤器是用来拦截请求的,而Servlet是用来处理请求的.
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter通过,那么会继续执行用户请求的Servlet,如果无法通过Filter,那么就无法执行用户请求的Servlet.
利用Filter可以实现对输入框的校验,如果不通过校验.可以直接拒绝不会去访问Servlet.这样节省了资源.还可以利用Filter解决整个web项目的中文编码问题.
下面展示EncodeFilter文件解决编码问题
@WebFilter(filterName = "EncodingFilter",urlPatterns = "/*")
//在注解里的名字写上本过滤器的名字EncodingFilter,url地址因为是检测整个项目,
//所以地址写”/*”,”/*"代表所有JSP与所有Servlet.这样只要JSP与Servlet有访问,
//就会走到本过滤器来,已达到检测修改整个项目中文编码传输问题
public class EncodingFilter implements Filter {
public void destroy() {
}
//创建文件的时候选择创建Filter型,这样会直接创建一个过滤器,并且直接将生命周期的三个方法写好,
//我们只需要在doFilter()方法,也就是运行时期访问的方法,在这里写判断就好了
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
EncodingRequest equest = new EncodingRequest((HttpServletRequest)req);
//这里会调用下面的EncodingRequest的方法
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//chain.doFilter(),这个为放行,也就是通过上面的一系列判断之后,如果输入流满足要求,
//会执行这个方法,也就是将请求的参数传入到Servlet中,因为本类检测所有Servlet,所以,
//放行的时候传入到响应的Servlet中,也就是,请求访问的Servlet地址
chain.doFilter(equest, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
由于此方法不能批量过滤get请求的参数,所以我们还需要写一个EncodingRequest的类来转换编码格式
public class EncodingRequest extends HttpServletRequestWrapper {
//这里需要继承HttpServletRequestWrapper
private HttpServletRequest request;
public EncodingRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
//这里要对请求方式进行判断,判断是GET还是POST
if (request.getMethod().toUpperCase().equals("GET")) {
//获得请求中的参数值
String value = request.getParameter(name);
try {
//获得这个值对应的字节数组,将字节数组根据utf-8的格式,创建出一个字符串对象
value = new String(value.getBytes("iso-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}else {
try {
request.setCharacterEncoding("UTF-8");
return request.getParameter(name);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return null;
}
}
到此,通过过滤器解决全局编码格式就演示完成了,每次用的时候只需要建立一个Encoding的文件夹,将这两个类放进去就可以了