音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

传智播客java web 过滤器
日期:2021-09-07 15:39:28   来源:脚本之家

根本不利于使用,Servlet应该本是为简化工作而创造的啊!我当时觉得是我的设计框架产生了问题。第二天我便问方老师,确实是使用上有些问题。比如,显示访问计数,我把它单独写成了一个Servlet,什么地方需要它时,便由那个Servlet.include引用计数的Servlet。但这样总会产生一些问题和使用上的不便。比如include的Servlet必须使用相同的流,如果使用forward后任何输出都无效了。
方老师当时建议,把有些功能写到一起。但最后提到了过滤器,那时我便对过滤器产生了兴趣,今日也终于一睹芳容!让人十分喜欢!
ServletFilter,Servlet过滤器:
Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术可以对web服务器管理的所有web资源:Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
ServletAPI提供了一个Filter接口,实现这个接口的Servlet就是一个过虑器。过虑器在WEB应用访问流程中如下:
由图可见,只要我们编写了过滤器,可以对一切访问WEB应用的连接进行过滤。比如,用户访问权限、统一WEB编码…
Filter是如何实现拦截的?
实现了Filter接口的Servlet是过滤器,因为Filter接口有一个doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法,只要用户访问我们在web.xml中配置的映射目录,服务器便会调用过滤器的doFilter方法。我们在这里实现过虑功能代码,当我们调用chain.doFilter(request, response);方法时,将请求反给服务器服务器再去调用相当的Servlet。如果我们不调用此方法,说明拒绝了用户的请求。
Filter开发入门:
在WEB应用中添加一个过滤器,有两步工作需要完成:
1.编写实现了Filter接口的Servlet——过滤器。
2.在web.xml中配置过滤器:
(1). <filter>标签添加器
(2). <filter-mapping>注册过滤器的映射目录(过滤目录),与注册Servlet一样。
在实际WEB应用中,我们可能需要编写多个过虑器,比如:1.统一WEB编码的过滤器(过虑所有访问)2.用户访问权限管理。这样,用户的访问需要选经过过滤器1过滤然后再经过过滤器2过滤。doFilter中有一个FilterChain参数,这个参数是服务器根据web.xml中配置的过滤器,按照先后顺序生成的过滤器链。当我们在doFilter方法中调用chain.doFilter(request, response);方法时,服务器会查找过滤链中是否还有过滤器,如果有继续调用下一个过滤器,如果没有将调用相应的Servlet处理用户请求。
Filter接口的其他细节:
1.Filter的Init(FilterConfig filterConfig)方法:
与Servlet的Init方法一样,在创建时被调用,之后被保存在内存中直至服务器重启或关闭时Filter实例才会被销毁。与Servlet不同之处在于,服务器启动时就会实例化所有Filter,而Servlet中有当用户第一次访问它时才会被实例化。我们通过在web.xml使用<init-param>对Filter配置的初始化参数,可以通过FilterConfig来获得。
FilterConfig的方法有:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
2.Filter的destroy()方法:
当服务器重启或关闭时,在销毁Filter之前调用此方法。
编写配置Filter练习程序:
1. 编写一个用于统一WEB字符编码的Filter:
复制代码 代码如下:

package cn.itcast.cc.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Encoding implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
//参数转换,因为我们已经它肯定是Http协议的请求。
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
//设置request和response使用的编码均为UTF-8。
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//设置完成后,交回给服务器。
arg2.doFilter(arg0, arg1);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}

2. 配置web.xml文件,添加下面部分:
复制代码 代码如下:

<filter>
<filter-name>encoding</filter-name>
<filter-class>cn.itcast.cc.filter.Encoding</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3. 上面是Filter的简单使用方式,后面会讲到高级应用。
Filter高级开发:
//参数转换,因为我们已经它肯定是Http协议的请求。
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
上面的两片段代码,是因为我们已经知道了request和response是服务器给我们封装好了的两个Http请求对象。我们对它进行了功能上的扩充。如果我们不知道request和response是谁创建的具体内容是什么,我们应该如何对它们的功能进行扩充?我们有两种方式可以扩充:
1. 编写一个子类,覆盖需要覆盖的方法。
2. 使用Decorator设计模式,来扩充我们想要的功能。
Decorator设计模式:
我们有时无法使用方法1,因为我们不知道一个对象的具休类,比如它是一个接口对象,实现类是谁?。所以我们最好使用方法2,之前我们有接触过工厂设计模式和单例设计模式,Java真是高级应用的完美体现。什么是Decorator设计模式?中文名称是“装饰”模式,下面我们使用此模式为request做一下功能上的扩充:
1.我们实现继承request接口类型ServletRequest。哦天哪,ServletRequest有太多的方法,难道我们要实现每一个方法?Servlet设计者们想到了这一点,并给我们提供了一个包装类——HttpServletRequestWrapper。我们就使用它做为父类吧!
2.在我们自定义类内部添加一个HttpServletRequest类型成员,因为我们就要装饰它。
3.编写我样想覆盖的方法,也就是我们想提供特殊功能的方法。
举例,上边我们编写的统一WEB编码的filter是存在问题的,如果我们提交一个表单,表单的提交方式为GET,那么我们设置request的编码是不起作用的。所以在这里我们就使用Decorator设计模式来完善统一编码的功能:
编写自定义类MyServletRequest.java类:
复制代码 代码如下:

class MyServletRequest extends HttpServletRequestWrapper {
// 我们要装饰的对象
HttpServletRequest myrequest;
public MyServletRequest(HttpServletRequest request) {
super(request);
this.myrequest = request;
}
// 我们要增强的功能方法
@Override
public String getParameter(String name) {
// 使用被装饰的成员,获取数据
String value = this.myrequest.getParameter(name);
if (value == null)
return null;
// 将数据转码后返回
try {
value = new String(value.getBytes("ISO8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}
}

我们修改Encoding.java过滤器的代码如下:
复制代码 代码如下:

public class Encoding implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
arg2.doFilter(new MyServletRequest((HttpServletRequest)request), arg1);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}

呵呵,看到Decorator设计模式的强大了吧!这一部分属于Filter的高级应用,明天还有一天的课程会讲解Filter的高级应用。我原本并没想到这么多,以为request和response已经足够用了,即使够用,但效率和代码还不够优美,加上这些高级应用变得比较优美,程序和编写和维护都十分方便!
课程的内容依然十分精彩,虽然老师讲的内容也已经了解了。但大部分同学还是有些吃不消的,因我有些软件开发经验,学习到现在感觉轻松一些。因为前些天都在学习自己陌生的基础知识,现在到了高级应用,还算应得来!桌面开发也好、WEB应用也好,程序逻辑都是一样的。只不过工作流程不大一样而以。更多的是需要练习,今日方老师有留给大家作业,内容便是修改上一次练习的自动登录和用户权限管理。好了,我应该做作业去了…。

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程