A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

同学们,今天讲的是过滤器Filter,Filter是JavaWeb三大组件(Servlet、Listener、Filter)之一,是很重要的一个概念,包括学习后面框架的时候,我们也离不开过滤器。

今日需要掌握的有:
  • 自动登录案例很经典也很重要,除了代码实现之外,实现思路希望大家整理一下
  • 规范网站编码过滤的案例重要的还是理解过滤器思想,代码辅助记忆

请同学们按照如上要求,总结今日所学。



23 个回复

正序浏览
万冕

filter过滤器,他能过滤浏览器向服务器发送的请求,对请求进行判断,或者ip判断,自动登录

服务器创建的时候filter就创建,服务器关闭的时候filter就摧毁
filter是需要去web里配置的,url就是用来设置需要过滤的路径,/*是全部过滤
<Servlet-name>需要过滤的Servlet的名字</Servlet-name>

*****<dispatcher>配置

request默认过滤request请求
如果设置了forward,就过滤转发,如果还想过滤request,就在写一个<dispatcher>
include:包含
error:错误页面

chain.doFilter(request, response)放行

通用字符集:装饰者模式:

增强的类和被增强类实现相同的接口,增强的类中获得到被增强的类的引用.
就是去重写request.getParameter方法,让他在方法内部直接先将字符转换
回复 使用道具 举报
许剑鸿  webDay23


Filter
过滤器:可以过滤从客户端向服务器发送的请求 可用于IP的过滤,脏话的过滤,自动登录,响应压缩(不知道是啥).......
(客户端的请求至资源之前 先通过过滤器过滤一遍再到达资源)
过滤器使用步骤:1 编写一个类实现Filter接口实现接口的方法 init doFilter destory 2配置过滤器

Filter生命周期:创建:服务器启动的时候(调用init方法)  销毁:服务器关闭(正常关闭调用destory方法)

FilterChain 过滤器链 过滤器链中的过滤器的执行的顺序与<filter-mapping>的配置顺序有关.
         doFilter(request,response); -- 放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.


使用过滤器完成自动登录的案例
难点(逻辑  Cookie与session的使用 )

了解   通用的字符集编码的过滤器(思想:在request至资源前通过过滤器增强request 并将增强过的request传至资源 资源使用的便是增强过的request.getparameter方法)
                        (通过自建类继承HttpServletRequest的模板类HttpServletRequestWrapper并重写其中getparameter方法完成增强)
回复 使用道具 举报
吴鹏
总结

Filter:
可以过滤从客户端向服务器发送的请求
过滤器的使用:进行IP的过滤,脏话过滤,自动登陆,响应压缩...

使用过滤器:
编写一个类,实现Filter;
chain.doFilter(request,response);放行

配置过滤器:
mapping中的url写上要使用过滤器的文件的路径,如果要全部都使用过滤器就使用通配符
filter-class写上使用的过滤器的全类名;

过滤器的生命周期:
创建:启动服务器的时候;
执行:发送请求的时候;
销毁:服务器关闭的时候;

FilterConfig:过滤器的配置对象;
String getFilterName();获得当前Filter的名称

获得初始化参数:在web.xml配置后
通过getInitParameter("初始化参数名");获得初始化参数;

获得所有的初始化参数:
getInitParameterNames();获得的是一个枚举,需遍历;

------------------------------------------------------

配置文件中关于多个Filter针对同个文件的拦截的执行顺序,
是根据配置文件中Filter的从上往下的书写顺序来执行的,
哪一个的顺序在前,就先执行哪一个Filter;

-----------------------------------------------------
FilterChain过滤器链:
过滤器链中的过滤器的执行顺需和过滤器在web.xml中的顺序有关,
谁在前谁就先执行,执行后如果放行,就找下一个过滤器,
执行完成后,响应的时候依然经过过滤器,从chain.doFilter(request,response)的下一句
开始继续执行;

Filter相关配置:
<url-pattern>的配置:
1 完全路径匹配    :以/开始
2 目录匹配        :以/开始,以*结束;  /demo2/*
扩展名匹配    :不能以/开始,以*开始;  *.do

<servlet-name>的配置:
可以根据servlet的名称拦截Servlet;

<dispacther>
REQUEST    :默认值
FORWARD:转发
INCLUDE:包含
ERROR:错误页面跳转(全局错误页面)
当拦截的页面有一个请求转发时,是无法拦截转发的页面,可以设置<dispacther>;

----------------------------------------------------------
自动登陆中Filter中处理session的步骤:
判断session是否为空
         不为空,放行
         为空,判断cookie是否为空
               为空,放行
               不为空,获取cookie的值
                     判断cookie的值是否有用户名和密码
                            没有,放行
                            有,调用业务层,查询此用户名和密码是否在数据库中有存在对应的用户对象
                                   不存在,放行
                                   存在,将此对象存放到session域中,放行
--------------------------------------------------------



回复 使用道具 举报
Filter
        概述
                可以过滤从客户端向服务器发送的请求
                具体应用
                        IP过滤
                        脏话过滤
                        自动登陆
                        响应压缩
        生命周期
                作用范围
                创建
                        服务器启动的时候创建
                销毁
                        服务器关闭的时候
                        项目从服务器中移除的时候
        使用
                编写一个类实现Filter接口
                通过配置文件配置过滤器
                        配置
                                在web.xml配置文件添加以下代码
<filter>
    <display-name>MyFilter</display-name>
    <filter-name>MyFilter</filter-name>
    <filter-class>mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/Servlet</url-pattern>
</filter-mapping>
                        <url-pattern>标签中写要过滤的路径
        Filter接口
                void init(FilterConfig filterConfig)
          Called by the web container to indicate to a filter that it is being placed into service.
                void destroy()
          Called by the web container to indicate to a filter that it is being taken out of service.
                void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.
                FilterChain接口
                         void doFilter(ServletRequest request, ServletResponse response)
          Causes the next filter in the chain to be invoked, or if the calling filter is the last filter in the chain, causes the resource at the end of the chain to be invoked.
导向下一个过滤器,如果该过滤器是链中最后一个过滤器,则导向目标资源
        FilterConfig
                String getFilterName()
          Returns the filter-name of this filter as defined in the deployment descriptor.
                String getInitParameter(String name)
          Returns a String containing the value of the named initialization parameter, or null if the parameter does not exist.
                Enumeration getInitParameterNames()
          Returns the names of the filter's initialization parameters as an Enumeration of String objects, or an empty Enumeration if the filter has no initialization parameters.
        相关配置
                <url-pattern>
                <dispatcher>
                        REQUEST默认值
                        FORWARD转发
                        INCLUDE包含
                        ERROR错误页面跳转(全局错误页面)
回复 使用道具 举报
Do1 中级黑马 2018-6-16 14:37:40
19#
本帖最后由 Do1 于 2019-11-23 00:36 编辑


Filter是一个在服务器的有过滤功能的类,当浏览器的请求发送过来时,首先会传到配置好的Fliter类中,Fliter中的doFilter方法如果没有使用chain方法的话,请求就到不到Servlet Jsp html中,如果使用了chain放行那么就会把请求放行然后服务器的处理完请求数据后再把响应给浏览器传过去,使用Filter时要实现一个Filter的接口,实现3个方法,销毁 创建 和拦截

Filter应用场景:
因为Filter也是在服务器内部的,所以这个Filter类的session req res等等都是和Servlet Jsp这些共享的,浏览器传过来的req要经过它,它也可以调用这些对象,所以Filter有点像是一个信息处理(比如编码转换)的小Servlet然后转发给主Servlet

1:编码处理,可以在Filter类先接收到req请求中的文本内容,统一进行编码处理后类似于转发形式的再传球给Servlet JSP等等应用中

2.IP地址过滤,因为req请求中携带有ip地址,因此可以指定ip段或者指定Ip放行

3.自动登录:自动登录是课堂上详细讲解的案例,它分为3个步骤

1.调用session 和requset对象   因为session是会话级别的浏览器每次请求cookie中都会携带sessionid
所以先判断session中的指定key存不存在,不存在的话去判断cookie中指定key存不存在,出于安全考虑对cookie进行用户名的二次判定,因为如果cookie被篡改了,那么你没有记住用户名的话也会自动登录这样的话,网页中的页面都拦截不了自动放行,在非管理人员情况下进入网站可能会对后台管理等数据造成威胁


回复 使用道具 举报
刘文峰
Filter(过滤器)可以在请求到达服务器后但还未到达目标资源前将其拦截,进行过滤然后放行;可以过滤ip,过滤文本,自动登录,压缩响应等.使用过滤器需要创建一个类实现Filter接口,重写doFilter()方法;然后在web.xml中配置属性就可以了,配置方式和servlet差不多,url里可以传入要过滤的资源的全路径,这样只有向该资源发送的请求会被过滤;也可以写”/*”过滤所有请求.
过滤器自动登录:
首先实现普通的登录功能(登陆成功时要将数据保存到session中);
自动登录就是通过获得自动登录复选框的值来判断是否需要自动登录;如果需要则在登录成功时将数据添加到cookie中.
过滤器实现自动登录:
1.获得session,判断session里是否有登录信息: 有则说明登录了,直接放行,因为在servlet中,只有登陆成功时才将信息保存到session中;
2.如果没有则判断Cookie里有没有信息,如果没有说明不需要自动登录功能,直接放行,因为只有勾选了自动登录复选框才会加cookie;
3.Cookie里有信息说明需要自动登录,将里面的信息取出来到数据库里进行查询,如果没有相同记录则说明信息变更过,直接放行;
4.数据库里有相同记录则将信息保存到session中,然后放行,此时页面上就可以显示你的信息了.
回复 使用道具 举报
黄进安:


1.      放行* doFilter(request,response); -- 放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.
--->放行相当于调用一个方法访问目标资源,访问完之后接着往下执行代码
--->过滤器链中的过滤器的执行的顺序与<filter-mapping>的配置顺序有关.
--->当所有的过滤器都执行且访问到目标资源后,从最后一个过滤器返回响应
2.      在自动登入的案例中遇见了cookie存中文出现异常的问题:
解决方案:
cookie存中文字符解决乱码问题:URLEncoder.encode(name, "utf-8");
读取cookie中的中文乱码问题: URLDecoder.decode(name,"utf-8");
Eg:
存:Cookie cookie = newCookie("autoLogin",URLEncoder.encode(exitsUser.getUsername()+"#"+exitsUser.getPassword(),"utf-8"));      
取: value =URLDecoder.decode(cookie.getValue(),"utf-8");
--->即name为存取cookie时的value值


回复 使用道具 举报
郭明杰
过滤器链中的过滤器执行顺序跟配置的mapping先后顺序有关
deFilter 方法可以放行到下一个过滤器
[File的相关配置]
        <urlpattern>的配置方式有多种,完全路径匹配是以 /开头,加上文件名+文件类型 :/Demo1.jsp
                目录匹配:一/开始 以*结束. /demo/*
                扩展名匹配:以*开始 .  *.do
        <dispatcher>配置:REQUEST 拦截请求(默认)                       
                        :FORWARD 拦截转发
                        :INCLUDE 拦截包含
                        :ERROR   错误页面跳转
        默认拦截请求!!如果写了拦截转发等 要实现拦截请求,必须再写一个拦截请求的配置语句
回复 使用道具 举报
陈叶隆
FilterChain:过滤器链
doFilter(request,response); -- 放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.
<dispatcher>的配置:(在web.xml中的<filter-map>中配置)
* REQUEST        :默认值.
* FORWARD        :转发.
* INCLUDE        :包含.
* ERROR                :错误页面跳转.(全局错误页面)
使用过滤器完成自动登录的功能:
// 判断session中是否有用户的信息:
                HttpServletRequest req = (HttpServletRequest) request;
                HttpSession session = req.getSession();
                User existUser = (User) session.getAttribute("existUser");
                if(existUser != null){
                        // 1. session中有用户信息.
                        chain.doFilter(req, response);
                }else{
                        // 2. session中没有用户信息.
                        // 获得Cookie的数据:
                        Cookie[] cookies = req.getCookies();
                        Cookie cookie = CookieUtils.findCookie(cookies, "autoLogin");
                        // 判断Cookie中有没有信息:
                        if(cookie == null){
                                // 2.1 没有携带Cookie的信息过来:
                                chain.doFilter(req, response);
                        }else{
                                // 2.2 带着Cookie信息过来.
                                String value = cookie.getValue();// aaa#111
                                // 获得用户名和密码:
                                String username = value.split("#")[0];
                                String password = value.split("#")[1];
                                // 去数据库进行查询:
                                User user = new User();
                                user.setUsername(username);
                                user.setPassword(password);
                                UserService userService = new UserService();
                                try {
                                        existUser = userService.login(user);
                                        if(existUser == null){
                                                //2.2.1 用户名或密码错误:Cookie被篡改的.
                                                chain.doFilter(req, response);
                                        }else{
                                                //2.2.2 有该用户,将用户存到session中,放行
                                                session.setAttribute("existUser", existUser);
                                                chain.doFilter(req, response);
                                        }
                                } catch (SQLException e) {
                                        e.printStackTrace();
回复 使用道具 举报
汪志阳:
1.判断session中有无用户信息-
登陆成功:数据储存在session中,
自动登录案例思路:首先完成登录信息的校验.先定义一个map接收文本框提交的username和password键值对,将接受的map封装到domain对象里,在传输到Dao执行sql语句去
完成与数据库的信息校验,在对返回的数据进行判断,执行响应或者重定向,需要注意的是数据只有存入session中,才能算是一次校验的完成.
第二步就是写一个过滤器,Filter,对服务器上cookie数据和客户端session的数据进行过滤.首先判断session中是否有用户的信息:如果有就不需要判断cookie了,顺序不能倒着判断
只有数据存入session了,才算是完成一次登录,所以需要先进性session的判断.session中如果有:放行.显示的是欢迎用户的界面;session中没有,就要进行cookie中数据的获取,
Cookie中没有登录信息则:放行.显示注册,登录;Cookie中有信息,获取Cookie中存的用户名和密码到数据库查询.反之cookie防暑串改;没有查询到:放行.说明数据cookie发生变更
查询到:将用户信息存入到session . 放行.,显示欢迎界面,完成自动登录.
2.第二个案例并不理解,知识大致感觉更像是一个加强工具类,该工具类对get\post出入的数据进行判断,并且进行调用方法进行数据的接收,不会导致乱码的发生.
回复 使用道具 举报
郑志祥
过滤器的生命周期;
创建;服务器启动
销毁;服务器关闭的时候




自动登录案例
需要用到,
1.cookie可以保存用户名和密码,可以设置保存时间
2.过滤器;用来校验用户密码是否被篡改



使用过滤器对实现用户名密码的校验
1.先设置一个index.jsp的主页面(该主页面使用了两次,设置了一个判断{existUser},如果为空就显示登录,注册,购物车,如果不为空(说明账号密码正确,进入主页,显得的是你好xxx,退出)在登录的位置设置一个超链接,跳转到登录页面(记得在登陆的jsp中留下name值与id值,并在复选框给name值,与value=“true”)
2,编写一个登录的Servlet,从数据库拿到数据,进行校验登录   a。接收参数   b。封装数据 c。调用业务 (判断返回值existUser是不是有数据,如果没有,说明用户名或者密码错误。如果有,说明登录成功(且将返回的existUser,存在sesion中,这样主页面才可以获得进行判断显示),并在此处查看复选框是否有被选中,如果被选中接收复选框的参数,它的value应该是true,(如果为true,就将用户名和密码编写成字符串)将它保存在cookie中,并设置生命周期和路径,以便下次访问,(记得将cookie返回浏览器))
3.编写filter文件(目的是检查cookie中保存的用户名密码是否正确,它第二次从数据库中获得用户名密码,进行校验)注意;记得配置web.xml的filter文件
  先检查session是否有用户的信息 session中如果有:放行.
         * * session中没有:
         *    * 从Cookie中获取:
         *        * Cookie中没有:放行.
         *        * Cookie中有:
         *            * 获取Cookie中存的用户名和密码到数据库查询.
         *                * 没有查询到:放行.
         *                * 查询到:将用户信息存入到session . 放行.
         */
回复 使用道具 举报
何平波
Filter(过滤器)
概述:可以过滤从客户端向服务器发送的请求.
功能:进行ip的过滤,敏感语言的过滤,自动登录,响应压缩...
配置过滤器xml文件,配置格式与Servlet差不多
<url-pattern>/*</url-pattern>  拦截的是全部响应与请求页面
<url-pattern>/指定jsp</url-pattern>  拦截的是指定jsp响应与请求页面
chain.doFilter(request,response) 放行

*监听器与过滤器是监控全局,比如你在某个页面执行某些操作,都会经过这些过滤器或者是监听器.

Filterchain  过滤器链
执行顺序:与<fiilter-maping>有关,谁先配置,谁先限制,然后服务器端返回的是相反的顺序
两个过滤器的执行顺序是:
过滤器1执行了
过滤器2执行了
过滤器限制对象执行了  
过滤器2再执行了      -服务器返回的顺序
过滤器1再执行了

案例步骤分析  自动登录
1.获得自动登录框的name属性,vlaue=true(判断复选框是否被选中),登录成功才做自动登录
2.判断自动登录的复选框被勾选了,将用户名和密码存入cookie中,用户名和密码用符号隔开,设置有效路

径和时长,添加到cookie中
3.利用过滤器实现自动登录
(1)判断session是否有用户的信息,有就放行,没有去找cookie,cookie没有的话放行,有的话就去数据

库查找,防止被串改  ,将查询到的用户信息存入到session中,放行

案例理解总结
将用户名和密码存入一个cookie中是比较关键的一点,然后为cookie设置生命周期和路径,这样cookie就

不会随着浏览器被关闭而被销毁.
获取到存入用户信息的session,如果有值的话就是代表登陆了,就放行到页面中去.如果sesion中没有的

话就是代表还没登陆,就去本地缓存Cookie找存入的用户信息,如果没有的话(没有登录信息)就放行,
如果Cookie有值的话将拼接起来的用户信息进行切割,将Cookie中的值拿去数据库进行匹配,如果匹配上

了,再将这些信息存入session中,这样下次不用登陆也可以直接在页面上看到登陆的信息了.
注意这里多加了一个防止信息被修改的功能,如果匹配不成功的话就是信息被修改过了
回复 使用道具 举报
侯玉林
.什么是过滤器Filter:
        可以过滤从客户端向服务器发送的请求.(无论是get还是post都过滤)
       
2.滤器的作用:
        * 进行IP的过滤,脏话过滤,自动登录,响应压缩...
       
        流程:浏览器向服务器发送数据,在到达目标之前,被服务器中的过滤器截获,然后进行相关过滤和更改操作

3.使用过滤器:
        1.编写一个类实现Filter接口:
        2.配置过滤器(web.xml):
                <filter>
                        <filter-name>aaa</filter-name>
                       
                        //过滤器所在类
                        <filter-class>com.itheima.Filter.FilterDemo</filter-class>
                 </filter>
                  
                 <filter-mapping>
                        <filter-name>aaa</filter-name>
                       
                        //拦截的页面
                        <url-pattern>/demo1/demo1.jsp</url-pattern>
                 </filter-mapping>
               
        3.运行通过
                public void doFilter(ServletRequest request, ServletResponse response,
                                FilterChain chain) throws IOException, ServletException {
                       
                        System.out.println("过滤器执行了");
                       
                        //放行后直接去找jsp,(相当于去访问jsp)
                        chain.doFilter(request, response);
                       
                        //如果有两个放行,就会访问两次jsp,两个jsp会被装到一个响应返回.
                        chain.doFilter(request, response);
                       
                        //执行完jsp后返回到这里
                        System.out.println("过滤器执行完毕了");
                }
       
回复 使用道具 举报
谢洪彬:
今天学习了过滤器--Filter
过滤器,可以理解为对一扇门,Filter就守在这门口,每个需要经过这扇门的人都需要经过Filter的同意,满足要求则放行,不满足要求就不放行;
Filter的简单入门:
1.我们可以编写一个类去实现Filter接口,实现接口三个的方法
2.在web.xml中去配置Filter,配置方式和配置Servlet基本一样,只是Filter中URL的路径代表的拦截路径
实现Filter中的三个方法:
1.init : 可以记录Filter的创建(服务器加载被创建)
2.doFilter : Filter被执行则这个方法被执行,也是比较关键的一个方法,在这个方法中可以去放行要过滤的程序,
放行: chain.doFilter(request, response);
3.distroy:可以记录Filter的销毁(服务器关闭被销毁)

Filter的URL填写方式:
1.完全相对路径   以/开始,xxx结尾
2.目录路径                以/*开始xxx 以/*结尾
3.扩展民匹配                 以*.xxx格式
今天学习了自动登陆的案例:
思路分析:
1.利用代码完成普通登录案例
2.在登录成功需要将用户名和密码存入session中,同时还需要判断自动登陆的复选框是否被选中,如果被选中则需要将用户名和密码存入Cookie中.
3.这是我么需要利用过滤器去拦截首页,然后开始判断
Session存在
放行
Session不存在
获取登录成功存在Cookie中的值
有Cookie值,取出来去数据库在查询一遍,用户存在的话就把用户        存入session中.
没有Cookie值,直接放习惯
今天的第二个案例是编码过滤:
1.我们使用的是装饰者模式去加强request中的getparameter()方法,
2.在Filter中拦截可以所有的需要执行的程序
3.经过过滤器调用方法获取加强后的request
4.通过放行吧加强后的request放行给Servlet类
回复 使用道具 举报
郑阳阳
自动登录Filter实现思路:
* 判断session是否为空
* 为空放行,显示未登录的主页面
* 不为空,获取cookie,判断cookie是否为空
* 为空放行,显示未登录的主页面
* 不为空,将cookie的数据拿到数据库查
* 返回值为空时,说明用户名或者密码被更改过,放行,显示未登录的主页面
* 不为空,将数据存入session,放行

编码过滤:
在Filter的doFilter中通过预处理request,重写getParameter方法,
分别对get和post得到的数据进行乱码处理.
                       
回复 使用道具 举报
郑雪平

今天主要学习了filter这个过滤器,因为在以后框架的学习中还会经常使用filter,所以它就显得尤为重要。过滤器:可以过滤从客户端发送到服务器端的所有请求信息,它是利用cookie技术来记住用户名和密码信息的,要想使用过滤器就需要编写一个类实现filter接口,使用filter过滤器我们可以用来实现诸多过滤功能,譬如IP地址过滤,脏话、敏感信息过滤,网站自动登录等。
  过滤器的生命周期可分为创建和销毁的过程,服务器启动的时候被创建了,服务器关闭时被销毁了。一个类中有多个过滤器放在一起的叫过滤器链,过滤器链中多个过滤器执行是有一定顺序的,即根据XML文件中<filter-mapping>的存储位置的先后顺序来依次执行的,
  filter过滤器的代码实现步骤:1.创建数据库和表文件;2.导入JAR包和工具类;3.创建包结构及其常用类;4.自动登录;5.利用cookie记住用户名和密码;6.完成自动登录的过滤器。
回复 使用道具 举报
张裕
Filter 过滤器
用来过滤客户端像服务器发送的请求 在访问网页之前进行一些操作
生命周期 服务器启动时创建 关闭时销毁 今天主要用来判断用户勾选自动登录后 二次校验Cookie来实现自动登录

过滤器链 根据xml中Filter mapping的配置顺序来执行 一个过滤器放行到下一个过滤器 其中一个没放行 后面的全部不执行
<dispatchar>配置拦截(重点)  可以用来配置拦截的操作类型
                Request:        请求        default
                Forward:        转发       
                Include:        包含
                Error:        全局错误页面跳转

利用过滤器来实现修改编码
创建增强类继承包装类HttpServletRequestWrapper
增强Parameter方法 在过滤器中创建增强类对象 增强Request对象
放行时传入增强过的Request对象

注意事项 Cookie中存中文需要使用URLEncoder来编码 URLDecoder解码 防止报错
回复 使用道具 举报
詹源

过滤器:

cookie记住用户的用户名和密码

Filter :
过滤器的使用:进行IP的过滤.脏话过滤,自动登录,响应压缩;;;
             在到达目的地之前进行拦截.

如何编写过滤器:
与监听器类似,建立类,实现接口过滤器接口
wb.xml中去配置下
配置
<filter>
<filter-name><filter-name>
<filter.class><filter.class>
<filtre>
<filter-mapping>

<filter-mapping>
//放行:
chai.doFilter(request,response);


过滤器的生命周期(了解.面试题servlet周期要掌握)
随服务器启动而创建,服务器关闭而销毁

FilterConfig:
//获得当前的Filter的名称
String filterName = filterConfig.getFilterName();
System.out.println(filterName);
//获得初始化参数
String usernama = filterConfig.getInitParameter
String password = filterConfig.getInitParameter

过滤器链执行顺序:

<servlet-name><servlet-name>

<dispatcher>的配置

<dispatcher>FORWORD<dispatcher>转发
<dispatcher>REQUEST<dispatcher>默认值

(页面登录:把user存到session中,才能叫登录.判断session中有没有user,有说明登录成功.才能访问,没有,显示请登录)

自动登录JSP界面的JAVA代码,用过滤器拦截,由过滤器来完成数据处理

通用的字符集编码的过滤器:

作用:在一个网站上,通常会提交带有中文的数据,GET/POST请求都有可能提交中文数据.通常情况下,在某个Servlet中处理中文乱码.
现在能不能乱码的处理交给过滤器完成.只需要在Servlet中调用request,getParameter();接收参数就可以.

增强request中的getParameter方法
继承                :控制这个类构造.
装饰者模式        :增强的类和被增强类实现相同的接口,增强的类中获得到被增强的类的引用.
缺点                :接口中方法太多.
动态代理        :被增强的类实现接口就可以.
回复 使用道具 举报
常小天
今天学习的是过滤器——filter。过滤器可以对请求进行拦截和筛选,将符合指定条件的请求放行到请求的资源位置。过滤器在服务器启动的时候创建,在服务器关闭或者项目从服务器移除时销毁。过滤器的使用方法大致上有两步。第一步是编写一个类去实现filter接口,第二步是在web.xml中配置过滤器。实现filter接口后要重写接口中的方法。Filter接口中的方法有三个,init方法在过滤器创建时执行,它是初始化方法;destroy方法在过滤器销毁时执行;而我们最关注的方法是第三个方法——doFilter方法,在这个方法中我们可以设置筛选请求的条件,还可以进行各种操作,在这个方法的最后我们需要使用chain对象调用doFilter方法来放行符合指定条件的请求。过滤器的使用方法并不难,难的是它在具体案例中的应用。今天的自动登录案例中就使用了filter,而这个案例的难点就在它比较复杂的逻辑上。本案例中,我们首先实现一下完全体的登录操作,也就是在验证用户名密码正确后将user对象存进session中。接下来进行自动登录功能的代码编写。首先在登录页面的“自动登录”复选框上设置好属性,name属性一定要加,还可以给它设一个value,值为true。下一步就是在servlet中获取自动登录复选框的值,如果复选框被勾选,那获得的值就是true,这时候就将从参数中获得的username和password用#等特殊符号链接成一个字符串,将这个字符串存入一个cookie中,在给这个cookie设置一个合适的生命长度,最后添加cookie。Servlet中的后续步骤照常编写。在添加好cookie后,我们可以来编写一个filter,在这个filter中先获得一下session,判断session中是否有user对象,如果有,则直接放行,如果没有,则获取cookie数组,在cookie数组中获取存有username和password的那个cookie,如果没有获取到,则放行,获取到了,则转成字符串再以#号分割,将username和password封装进一个user对象,调用登录的service方法进行验证,如果验证失败,数据库中没有这个用户信息,则放行,如果验证成功,就将这个user对象存进session在放行。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马