FilterConfig
FilterConfig 类似 ServletConfig , 是 filter 的配置信息对象 。 FilterConfig 对象具有以下方法 。

文章插图
getFilterName():获取当前 filter 的名字 。 获取的是在 web.xml 中配置的 filter-name 的值
getInitParameter(String name):获取 filter 的初始化参数 。 在 web.xml 中配置

文章插图
getInitParameterNames():获取 filter 初始化参数名的集合 。
getServletContext():获取当前 web 工程的 ServletContext 对象 。
Filter 的 url-pattern
url-pattern 是配置 filter 过滤哪些请求的 。 主要有以下几种配置:
web.xml 中配置的/都是以当前项目路径为根路径的
1)精确匹配:
/index.jsp/user/login 会在请求/index.jsp、/user/login 的时候执行过滤方法
2)路径匹配:
/user/* /* 凡是路径为/user/下的所有请求都会被拦截 , /*表示拦截系统的所有请求 , 包括静态资源文件 。
3)扩展匹配:
*.jsp *.action 凡是后缀名为.jsp .action 的请求都会被拦截 。
注意:/login/*.jsp 这种写法是错误的 , 只能是上述三种的任意一种形式 。 不能组合新形式 。
*jsp 也是错误的 , 扩展匹配必须是后缀名
4)多重 url-pattern 配置
上面的三种形式比较有局限性 , 但是 url-pattern 可以配置多个 , 这样这三种组合基本就能解决所有问题了
多 Filter 执行顺序
如果同一个资源有多个 filter 都对其拦截 , 则拦截的顺序是按照 web.xml 中配置的顺序进行的
执行流程图如下

文章插图
请求总是在处理之后再回来执行 doFilter 之后的方法 。
HttpServletWrapper 和 HttpServletResponseWrapper
定义
Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象,HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法, 这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法
//包装类实现 ServletRequest 接口.
public class ServletRequestWrapper implements ServletRequest {
//被包装的那个 ServletRequest 对象
private ServletRequest request;
//构造器传入 ServletRequest 实现类对象
public ServletRequestWrapper(ServletRequest request) {
if (request == null) {
throw new IllegalArgumentException("Request cannot be null");
}
this.request = request;
}
//具体实现 ServletRequest 的方法: 调用被包装的那个成员变量的方法实现 。
public Object getAttribute(String name) {
return this.request.getAttribute(name);
}
public Enumeration getAttributeNames() {
return this.request.getAttributeNames();
}
//...
}
相类似 Servlet API 也提供了一个 HttpServletResponseWrapper 类来包装原始的 response 对象
作用
用于对 HttpServletRequest 或 HttpServletResponse 的某一个方法进行修改或增强.
public class MyHttpServletRequest extends HttpServletRequestWrapper{
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String val = super.getParameter(name);
if(val != null && val.contains(" fuck ")){
val = val.replace("fuck", "****");
}
return val;
}
}
程序员写代码之外 , 如何再赚一份工资?
使用
在 Filter 中, 利用 MyHttpServletRequest 替换传入的 HttpServletRequest
HttpServletRequest req = new MyHttpServletRequest(request);
filterChain.doFilter(req, response);
此时到达目标 Servlet 或 JSP 的 HttpServletRequest 实际上是 MyHttpServletRequest
来源:NAXS网
推荐阅读
- 灵超偶练收到什么礼物 灵超偶练收到什么礼物
- 超级弹丸论破2礼物 弹丸2礼物
- 快速联系天猫小二的4个方法 天猫超市怎么联系卖家客服
- 揭秘刷牙的误区
- 牛街超市有礼品装的牛羊肉吗 小礼物类型的公主房
- 客户赠送礼品税收 兄妹去超市买礼物
- 抖音网名女生好听最火简单,超好听的抖音名字女生
- 超好听的五字昵称大全,干净好听的昵称5个字
- 网名女生霸气冷酷好听昵称,霸气网名女生超拽冷酷
- pdf解密,超简单 pdf加密破解