[原创]Filter的使用_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3799 | 回复: 1   主题: [原创]Filter的使用        下一篇 
xiuwen.zhao
高级会员
等级:上尉
经验:668
发帖:38
精华:0
注册:1970-1-1
状态:离线
发送短消息息给xiuwen.zhao 加好友    发送短消息息给xiuwen.zhao 发消息
发表于: IP:您无权察看 2014-8-29 17:11:56 | [全部帖] [楼主帖] 楼主

    Filter主要用于对用户请求进行预处理,也可以对HttpServletResponse进行处理,是一个典型的处理链。Filter也可以对用户请求生成相应,但实际上很少用Filter向用户生成相应。使用Filter的流程一般为:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成相应,最后Filter在对服务器相应进行处理。Filter可以拦截用户的HttpServletRequest,并且可以修改HttpServletRequest头和数据。同时,Filter也可以拦截服务器的HttpServletResponse,并且可以修改HttpServletResponse头和数据。 

    创建一个Filter只需两个步骤:1.创建Filter处理类。2.web.xml文件中配置类。

    创建Filter类必须实现javax.servlet.Filter接口,在该接口中定义了如下方法。

    void init(FilterConfig config):用于完成Filter的初始化。

    void destrory():用于Filter销毁前,完成某些资源回收。

       void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实现过滤功能,该方法对每个请求或相应增加额外的处理。

    下面是一个简单的Filter,这个Filter主要是查看用户请求的页面地址,如果不是登陆页面就跳转到登陆页面。

public class ReqFilter implements Filter {
      private FilterConfig config;
      public void init(FilterConfig config) {
            this.config = config;
      }
      public void destroy() {
            this.config = null;
      }
      public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
            //获取filter的配置信息,这里获取登陆页面的路径。
            String loginPage = config.getInitParameter("login");
            HttpServletRequest req = (HttpServletRequest) request;
            //获取用户请求的页面。
            String requestPath = req.getServletPath();
            //判断用户请求的页面是不是登陆页面,如果是就放行请求,不是就跳转到登陆界面。
            if (!requestPath.endsWith(loginPage)) {
                  System.out.println("你请求的页面是:"+requestPath+",将会跳转到登陆页面。");
                  request.getRequestDispatcher(loginPage).forward(request, response);
            } else {
            chain.doFilter(request, response);
            System.out.println("你请求的页面是登陆页面");
            System.out.println("处理前:"+response.getContentType());
            response.setContentType("text/txt");
            System.out.println("处理后:"+response.getContentType()););
      }
}
}


 doFilter既能对用户请求进行处理,也能对服务器响应进行处理。它们的分界线为是否调用了chain.doFilter(),执行该方法前对用户请求进行处理,执行该方法后对服务器响应进行处理。

    Filter类的配置与Servlet类似,只需配置Filter的名字与实现类,名字和Filter拦截的URL,/*表示拦截所有的请求,具体代码如下:

<filter>
<filter-name>filter</filter-name>
<filter-class>ReqFilter</filter-class>
<init-param>
<param-name>login</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


该贴被xiuwen.zhao编辑于2014-8-29 17:20:18




赞(0)    操作        顶端 
koei
版主
等级:大校
经验:4186
发帖:7
精华:0
注册:2011-7-21
状态:离线
发送短消息息给koei 加好友    发送短消息息给koei 发消息
发表于: IP:您无权察看 2014-8-29 18:18:02 | [全部帖] [楼主帖] 2  楼

楼主还是涉猎广泛,进度飞速啊

北京联动北方科技有限公司



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论