javaWeb-filter

来源:互联网 发布:涂鸦照片的软件 编辑:程序博客网 时间:2024/05/02 02:26
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         @Override46         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             //屏蔽尖括号 换成 &gt; &lt;63             value = value.replace(">","&gt;");64             value = value.replace("<","&lt;");65 66             return value;67         }68     }69 }
0 0
原创粉丝点击