过滤器Filter
在使用javaweb进行开发的时候很多人都会遇到乱码的问题,我们不得不在Servlet配置请求和响应的编解码格式
package com.kangzhu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.getWriter().write("你好");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
但是每个Servlet中都配置编解码格式不免有些麻烦,这时就可是通过Filter来解决这个问题。
Filter的使用
-
导包
package com.kangzhu.filter; import javax.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter 初始化完成"); } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); filterChain.doFilter(servletRequest, servletResponse); } public void destroy() { System.out.println("Filter 销毁"); } }
这里我们从package javax.servlet包下导入Filter;此外还有几点需要注意:
-
初始化是在服务器启动时完成的
-
销毁是在服务器关闭时完成的
-
在doFilter函数中进行相应的设置后需要通过
filterChain.doFilter(servletRequest, servletResponse);
语句让请求和响应对象同行。
-
-
绑定路由
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.kangzhu.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/helloServlet</url-pattern> </servlet-mapping> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.kangzhu.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/helloServlet</url-pattern> </filter-mapping>
这样的话次访问"/helloServlet"路径都会通过过滤器;
-
访问同一资源可以决定是否通过过滤器
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.kangzhu.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/helloServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
为同一个Servlet设置两个路由即可;
-