JAVA过滤器的使用(Filter)
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
这是在Servlet里面设置字符编码的代码,但是通常情况下Servlet不止一个,所以我们需要在每一个Servlet中都写上上面的代码,这样的话,不仅麻烦,而且容易搞混淆。
所以我们对于这类多个Servlet中会执行相同的代码的时候,我们通常可以使用过滤器来帮我们完成操作:
过滤器:
如果想要使用过滤器,首先需要实现Filter类,并重写三个需要的方法:
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(filterName = "TestFilter2",urlPatterns = "/*") public class TestFilter2 implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }
init方法: 容器在创建当前过滤器的时候自动调用;
destroy方法: 容器在销毁当前过滤器的时候自动调用
doFilter方法: 过滤器的主要代码写在这个地方
1 @WebFilter(filterName = "TestFilter2",urlPatterns = "/*")
这一行代码的意思是添加一个注解,通过这行代码就不需要再去web.xml中注册了
其中 filterName 代表的是这个过滤器的名字,后面那个urlPatterns 代表的是过滤的路径 /* 代表所有路径,意味着访问所有的路径的时候都会先访问这个过滤器
chain.doFilter(req, resp);
这一行代码代表的是如果还有其他的过滤器就调用其它的过滤器,但是需要注意,这一行代码必须写在doFilter方法的最后面
1 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 2 //这样在每个Servlet执行的时候都会先进行这个 3 HttpServletRequest request = (HttpServletRequest) req; 4 HttpServletResponse response = (HttpServletResponse) resp; 5 6 request.setCharacterEncoding("utf-8"); 7 response.setContentType("text/html;charset=utf-8"); 8 9 //因为有可能不止这一个过滤器,所以需要将所有的过滤器执行 10 //注意 这一行代码一定要写到最后 11 chain.doFilter(req, resp); 12 }
其中3-7行代码就是设置编码
由于doFilter传递进来的默认是ServletRequest对象 而设置字符集的是在HttpServetRequest 所以我们需要强制转换一下
转换过后我们就可以进行设置了。
下面附上我另外一个测试过滤器的代码:
1 import javax.servlet.*; 2 import javax.servlet.annotation.WebFilter; 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletRequestWrapper; 5 import javax.servlet.http.HttpServletResponse; 6 import java.io.IOException; 7 import java.io.UnsupportedEncodingException; 8 9 /** 10 * urlPatterns代表的是需要将那些路径进行过滤器过滤 这里为* 代表所有的路径都需要进入这个过滤器 11 */ 12 @WebFilter(filterName = "TestFilter",urlPatterns = "/*") 13 public class TestFilter implements Filter { 14 public void destroy() { 15 } 16 17 /** 18 * 在这里面写的任何代码 在执行Servlet JSP 等前 都会被执行 19 */ 20 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 21 //这样在每个Servlet执行的时候都会先进行这个 22 HttpServletRequest request = (HttpServletRequest) req; 23 HttpServletResponse response = (HttpServletResponse) resp; 24 25 request.setCharacterEncoding("utf-8"); 26 response.setContentType("text/html;charset=utf-8"); 27 28 //因为有可能不止这一个过滤器,所以需要将所有的过滤器执行 29 //注意 这一行代码一定要写到最后 30 chain.doFilter(req, resp); 31 } 32 33 public void init(FilterConfig config) throws ServletException { 34 35 } 36 37 //通过重写getParameter方法,实现get方法自动转码 38 class MyWrapper extends HttpServletRequestWrapper{ 39 private HttpServletRequest request; 40 public MyWrapper(HttpServletRequest request) { 41 super(request); 42 this.request = request; 43 } 44 45 @Override 46 public String getParameter(String name) { 47 String value = this.request.getParameter(name); 48 if(value == null){ 49 return null; 50 } 51 52 //如果是get方法提交过来的 53 if(this.request.getMethod().equalsIgnoreCase("get")){ 54 try { 55 // 进行转码 56 value = new String(value.getBytes("ISO-8859-1"),"utf-8"); 57 } catch (UnsupportedEncodingException e) { 58 e.printStackTrace(); 59 } 60 } 61 62 //屏蔽尖括号 换成 > < 63 value = value.replace(">",">"); 64 value = value.replace("<","<"); 65 66 return value; 67 } 68 } 69 }
I love you