Filter是Servlet中一个很重要的规范。它能够对request和response进行拦截,并进行预处理。也就是说在request到达Servlet之前预处理request,在reponse离开Servlet,到达客户端之前预处理response。有了Filter,我们就可以对系统进行统一管理。
拿字符集设置来举例,如果我们不使用Filter,那么我们就需要在每个页面的Servlet里面都要设置字符集:
上面是添加用户的时序图,在添加用户时,我们需要设置一次字符集;而在修改用户时,我们仍然需要需要设置字符集,假如现在我们有新需求。所有页面都不需要进行字符集设置了,那么,我们就需要相对每一个页面进行修改,不利于同一控制。
另外,在上面添加用户的逻辑中,设置字符集显然是一个独立的逻辑单元,所以我们非常有必要将它分离开来。
web.xml配置文件中进行配置,写在配置文件是为了便于日后修改字符集,不在程序里写死:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>CharsetEncodingFilter</filter-name> <filter-class>com.xxjstgb.drp.util.filter.CharsetEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping> </web-app>
CharsetEncodingFilter的filter-mapping中,它的url-pattern为*.jsp,这表示对所有jsp都起作用。/servlet/*表示以/servlet/的所有URL将被过滤。
字符编码过滤器代码:
package com.xxjstgb.drp.util.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; public class CharsetEncodingFilter implements Filter { private String encoding; public void destroy() {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //设置字符集【这里没有写死,而是读取配置文件】 request.setCharacterEncoding(encoding); //继续执行 chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { //读取xml文件里面设置的参数,成员变量里面 this.encoding=filterConfig.getInitParameter("encoding"); } }
这样就能够完成统一字符集设置了。
另外,Filter仍然能够跳转到登录页面的问题:首先,用户需要通过登录页面才能够登录系统;然后,由于权限问题,某用户登录系统后,在地址栏输入相应的url,不应该跳到越权页面;还有,就是Session过期后,需要跳到登陆页面重新登录,不应该允许用户继续访问。
这些问题,依然能够使用Filter进行统一管理。不往上贴了。有兴趣的话,大家可以照葫芦画葫芦自己做一下。