博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
servlet的filter的使用
阅读量:6823 次
发布时间:2019-06-26

本文共 3652 字,大约阅读时间需要 12 分钟。

一、概述

过滤器是servlet的一个重要特性,它提供一种机制,允许在过滤器中,即可以修改浏览器的请求信息,也可以对服务器处理后的响应信息进行修改。

一个过滤器是一个实现了Filter接口的java类。其关键的的方法是:

void doFilter(ServletRequest req, ServletResponse resp,  FilterChain chain)

在该方法中可以做如下动作:

1)通过参数req可以获取请求信息,并可以修改请求信息。当然也可以不做任何事情。

2)调用参数chain的方法 chain.doFilter(req, resp); 就是将请求传递给下一个filter或请求的目的地处理。

如果不调用该方法,则该请求就被终止往下传递,这种情况下,应该在过滤器中产生应该返回到客户端的响应信息。

3)通过参数resp获取请求被处理的返回结果,可以修改这个返回结果。

注意,一个url请求可以被多个过滤器匹配到,这时会按照匹配的顺序逐个由这些过滤器处理。

上面这张图描写了一个请求被多个过滤器处理,直至响应的过程。

 

二、一个最简单的例子

在web.xml中配置如下的filter及其匹配规则如下:

MyFilter
com.nau.MyFilter
MyFilter
/*

上面的匹配规则,表示任意的url请求都会被匹配到MyFilter过滤器。

编写一个MyFilter.java类,代码如下

package com.nau;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;import javax.servlet.http.HttpServletRequest;public class MyFilter implements Filter {    @Override    public void destroy() {    }    @Override    public void doFilter(ServletRequest req, ServletResponse resp,            FilterChain chain) throws IOException, ServletException {        String url = ((HttpServletRequest) req).getRequestURI();        System.out.println("filter:" + url);        chain.doFilter(req, resp);    }    @Override    public void init(FilterConfig arg0) throws ServletException {    }}

启动web服务器,打开浏览器,输入各种url,会发现任何的资源请求都会被该filter拦截。只是该filter只是打印了一下url,并没干任何事。注意doFilter方法中最后一句一定不要忘了 chain.doFilter(req, resp); 否则请求被Filter处理后就没法往下继续传递处理了。

需要说明的是,在web.xml中配置过滤器的匹配规则时,通过<url-pattern>标签配置的url地址的匹配规则。如果想要与某个被请求的servlet相匹配。则描写方式是如下:

MyFilter
ActionServlet

上面的规则表示,所有对ActionServlet的请求都会被匹配到MyFilter上,从而被该过滤处理。

三、Filter的一个应用场景案例

在需要权限管理的应用中,jsp和servlet等动态资源比较好鉴权,可以在其中直接编写相关代码进行权限检查。

但对于静态资源如html文件,如果希望鉴权,比如希望如果当前没有登录,则希望跳转到登录页面。那这该如何处理呢?

这就可以利用过滤器来处理。

在web.xml中可配置:

MyFilter
com.nau.MyFilter
MyFilter
*.html

上面的配置意思是所有的扩展名为 html的请求都会被MyFilter过滤器处理。处理器的代码如:

package com.nau;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;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.zte.boot.entry.UserInfo;import com.zte.boot.service.UserService;public class MyFilter implements Filter {    @Override    public void destroy() {    }    @Override    public void doFilter(ServletRequest req, ServletResponse resp,            FilterChain chain) throws IOException, ServletException {        HttpServletRequest httpReq = (HttpServletRequest)req;        HttpServletResponse httpResp = (HttpServletResponse)resp;        String appPath = httpReq.getContextPath();                //通过session检查是否存在当前用户        HttpSession session = httpReq.getSession(true);        String userid = (String)session.getAttribute("userid");               //如果不存在则重定向到登录页面        if (userid == null) {            httpResp.sendRedirect(appPath+"/login");            return;        }                //如果已经登录,则正常由后续流程处理        chain.doFilter(req, resp);    }    @Override    public void init(FilterConfig arg0) throws ServletException {    }}

 

四、小结

本文介绍了servlet的Filter的使用,并举了个鉴权的案例。

应用Filter除了编写过滤器代码外,还需要配置过滤器的匹配规则,这个与Servlet的匹配规则一样,

具体可参考文章

 

转载地址:http://uyozl.baihongyu.com/

你可能感兴趣的文章
演示:如何编译tbox
查看>>
简单的安卓应用授权认证(JNI)
查看>>
查看硬盘读取速率
查看>>
把匹配的小写转换成大写(\U、\u)
查看>>
【Android网络开发の5】Android中的网络数据下载
查看>>
linux终端使用python的matplotlib模块画图出现“could not open display”问题解决
查看>>
9月国内浏览器市场份额大战:IE份额上升至48.45%
查看>>
Tapestry 教程(五)实现Hi-Lo猜谜游戏
查看>>
2015年12月国内网民地域分布12强:湖北跻身上榜
查看>>
mysql-5.6安装
查看>>
LNMP环境搭建 Ubuntu篇
查看>>
设置低版本VDA注册高版本DDC
查看>>
multi-process script for ping host
查看>>
云数据库SQL Server 2008 R2版推出OSS版本数据上云
查看>>
Android 侵权案下周复审
查看>>
shell基础知识;
查看>>
RocketMQ源码分析之RocketMQ事务消息实现原理中篇----事务消息状态回查
查看>>
shell 中如何输出 n 个连续字符
查看>>
Bootstrap V4 自学开始!
查看>>
技术博客2014年4月份头条记录
查看>>