切面性服务——DRP项目中Filter的应用

Filter是Servlet中一个很重要的规范。它能够对request和response进行拦截,并进行预处理。也就是说在request到达Servlet之前预处理request,在reponse离开Servlet,到达客户端之前预处理response。有了Filter,我们就可以对系统进行统一管理。


切面性服务——DRP项目中Filter的应用_第1张图片


拿字符集设置来举例,如果我们不使用Filter,那么我们就需要在每个页面的Servlet里面都要设置字符集:


切面性服务——DRP项目中Filter的应用_第2张图片


上面是添加用户的时序图,在添加用户时,我们需要设置一次字符集;而在修改用户时,我们仍然需要需要设置字符集,假如现在我们有新需求。所有页面都不需要进行字符集设置了,那么,我们就需要相对每一个页面进行修改,不利于同一控制。

另外,在上面添加用户的逻辑中,设置字符集显然是一个独立的逻辑单元,所以我们非常有必要将它分离开来。


切面性服务——DRP项目中Filter的应用_第3张图片


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进行统一管理。不往上贴了。有兴趣的话,大家可以照葫芦画葫芦自己做一下。


你可能感兴趣的:(java,架构设计)