java Servlet过滤器

Java过滤器是实现了javax.servlet.Filter接口的java类。

用途:

    提出问题:

     我们知道为了避免提交数据的乱码问题,需要在每次使用请求之前设置编码格式。在你复制粘贴了无数次request.setCharacterEncoding(“gb2312”);后有没有想要一劳永逸的方法呢?能不能一次性修改所有请求的编码呢?

    解决问题:

     过滤器可拦截请求,在执行其它web组件(如:jsp,servlet等)之前执行; (这样可以利用过滤器设置请求对象的字符集,权限控制等) 。常用作(编码设置,权限控制,论坛脏话过滤,登陆和审核过滤,加密过滤,图像转换过滤,数据压缩过滤,认证过滤)

                   过滤器是一个程序,它先于与之相关的servlet或jsp页面运行在服务器上。过滤器可附加到一个或多个servlet或

jsp页面上,并且可以检查进入这些资源的请求信息

    视图 :

    先:客户端---->过滤链----->服务端  

    后:服务端------>过滤链----->客户端(和上面反向)

                过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请    求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之    前,这样才能确保在使用请求中的数据前设置正确的编码。

   过滤器的方法:

     public void init(FilterConfig filterConfig) throws ServletException { }  

           public void destroy() {}

     public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException,

    ServletException {
          HttpServletRequest request = (HttpServletRequest) req;
          HttpServletResponse response = (HttpServletResponse) res;
          HttpSession session = request.getSession();
          PrintWriter out = response.getWriter();
          if (session.getAttribute("username") == null) {
           // 没登录,回到login.html
           String message = "你还未登录,或者会话已超时";
           String url = request.getContextPath() + "/login.html";
           out.println("<script>alert('" + message
             + "');window.location.href='" + url + "';</script>");
          } else {
           chain.doFilter(request, response);
          }
     }

配置:

                   老的

      <filter>
         <filter-name>encodingFilter</filter-name>
         <filter-class>com.sato.filter.EncodingFilter</filter-class>
          <init-param>
          <param-name>encoding</param-name>
          <param-value>gb2312</param-value>
          </init-param>
    </filter>
    <filter-mapping>
                   <filter-name>encodingFilter</filter-name>
                    <url-pattern>/*</url-pattern>
    </filter-mapping>

               注释:   只过滤客户端请求服务端时发生(如重定向),在服务端之间并没有发生(如转发)

    新的

    在servlet-2.3中,Filter会过滤一切请求,包括服务器内部使用forward转发请求和<%@ include file=“/index.js    p”%>的情况。到了servlet-2.4中Filter默认下只拦截外部提交的请求,forward和include这些内部转发都不会被过    滤,但是有时候我们需要forward的时候也用到Filter,这样就需要如下配置:
    <filter>
                        <filter-name>TestFilter</filtername>
            <filter-class>anni.TestFilter</filter-class>
    </filter>
    <filter-mapping>
            <filter-name>TestFilter</filtername>
            <url-pattern>/*</url-pattern>
            <dispatcher>REQUEST</dispatcher>
            <dispatcher>FORWARD</dispatcher>
            <dispatcher>INCLUDE</dispatcher>
            <dispatcher>EXCEPTION</dispatcher>
    </filter-mapping>

 

                URL-Pattern的配置

                      <url-pattern>/*</url-pattern>   匹配所有的

                                   <url-pattern>*.do</url-pattern>   匹配指定格式的

                                   <url-pattern>/TeServlet1</url-pattern>   匹配TeServlet 路径下的

                注意:过滤器只过滤地址栏上的又相关的匹配的地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值