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

来源:互联网 发布:内网端口转发工具 编辑:程序博客网 时间:2024/05/21 05:42

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


原创粉丝点击