XMPPFramework开发(四):电子名片葡京娱乐注册

</br>

一、Listener监听器

Javaweb开发中的监听器,是用以监听web常见对象 HttpServletRequest HttpSession
ServletContext

监听它们的成立与销毁、属性变化 以及session绑定javaBean

1、监听机制

  • 事件  就是一个政工
  • 事件源  爆发这些业务的源流
  • 监听器  用于监听指定的事件的对象
  • 挂号监听 要想让监听器可以监听到事件发生,必须对其举办登记。

2、Javaweb开发中常见监听器

2.1、监听域对象的成立与销毁

  • 监听ServletContext创立与销毁  ServletContextListener
  • 监听HttpSession创设与销毁  HttpSessionListener
  • 监听HttpServletRequest创设与销毁  ServletRequestListener

2.2、监听域对象的性能变化

  • 监听ServletContext属性变化  ServletContextAttributeListener
  • 监听HttpSession属性变化  HttpSessionAttributeListener
  • 监听HttpServletRequest属性变化  ServletRequestAttributeListener

2.3、监听session绑定javaBean

它是用来监听javaBean对象是不是绑定到了session域   HttpSessionBindingListener

它是用于监听javaBean对象的活化与钝化
 HttpSessionActivationListener

3、监听器的飞速入门

关于创造一个监听器的步子

  1. 创造一个类,实现指定的监听器接口
  2. 重写接口中的方法
  3. 在web.xml文件中对监听器举办挂号。
  4. ServletContext对象的始建与销毁

3.1、关于域对象成立与销毁的言传身教

本条目的是在服务器启动时创设的,在服务器关闭时销毁的。

HttpSession对象的创办与销毁

HttpSession session=request.getSession();

Session销毁 的方法

  1. 默认超时  30分钟
  2. 关闭服务器
  3. invalidate()方法
  4. set马克斯(Max)InactiveInterval(int interval) 可以安装超时时间

题材:直接访问一个jsp页面时,是否会创制session?

会创建,因为我们默认情状下是足以在jsp页面中一向采取session内置对象的。

HttpServletRequest成立与销毁

Request对象是殡葬请求服务器就会创制它,当响应暴发时,request对象就会销毁。

3.2、演示了Request域对象中性能变化

在java的监听机制中,它的监听器中的方法都是有参数的,参数就是事件目标,而我辈能够通过事件目标直接得到事件源。

3.3、**演示session绑定javaBean**

1、javaBean对象活动感知被绑定到session中.

HttpSessionBindingListener 这多少个接口是由javaBean实现的,并且不需要在web.xml文件中注册.

2、javabean对象足以活化或钝化到session中。

HttpSessionActivationListener假如javaBean实现了这么些接口,那么当大家健康关闭服务器时,session中的javaBean对象就会被钝化到大家指定的文件中。

即时一回在启动服务器,因为我们已经将对象写入到文件中,这时就会活动将javaBean对象活化到session中。

咱俩还需要个context.xml文件来部署钝化时存储的文件

在meta-inf目录下开创一个context.xml文件

<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="it315"/>
</Manager>
</Context>

前言


上一篇博客中咱们说到哪些通过XMPPFramework中的代理方法来拿到到相知节点数据音讯,不过我们发现节点新闻能展现的只有JID,所以前日大家就说一下在XMPPFramework如何设置名片音信以及哪些得到自己的和挚友的片子音信.

挂号时候的头像的设置

</br>

案例-定时销毁session

1、如何可以将每一个成立的session全都保存起来?

咱俩得以做一个HttpSessionListener,当session对象创设时,就将这些session对象装入到一个凑合中.

将集合List<HttpSession>保存到ServletContext域中。

2、怎么样可以判明session过期了?

在HttpSession中有一个格局public long
getLastAccessed提姆(Tim)e()

它可以拿走session对象最后选拔的时光,可以使用invalidate方法销毁。

ps(我们地点的操作需要动用任务调度效用.)在java中有一个提姆(Tim)er定时器类

 

package com.timer;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TestTimer {
    public static void main(String[] args) {
        Timer t = new Timer();

        t.schedule(new TimerTask() {

            @Override
            public void run() {
                System.out.println(new Date().toLocaleString());
            }
        }, 2000, 1000);
    }
}

关于六个域对象得到

尽管在Servlet中要取得request,在点子上就有,request.getSession() 
getServletContext();

假定大家有request对象了,  request.getSession()   request.getSession().getServletCotnext();

 

public class MySessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent arg0) {
        HttpSession session = arg0.getSession();
        //得到application中的list集合
        ServletContext application = session.getServletContext();
        //得到session对象,并放入list集合
        List<HttpSession> list =(List<HttpSession>) application.getAttribute("sessions");
        list.add(session);
        System.out.println("添加了"+session.getId());
    }
    public void sessionDestroyed(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
    }

}

次第在动用时,需要考虑并发问题,因为大家在web中,它肯定是一个多线程的,那么我们的次序对聚集举行了增长,还有移除操作。具体在MyServletContextListener的法子中如下

public class MyServletContextListener implements ServletContextListener {
    public void contextDestroyed(ServletContextEvent arg0) {   
    }
    public void contextInitialized(ServletContextEvent arg0) {
        //通過事件原對象得到事件源
            ServletContext application = arg0.getServletContext();
            //创建一个集合 存储所有session对象
            final List<HttpSession> list = Collections.synchronizedList(new ArrayList<HttpSession>());
            application.setAttribute("sessions", list);
            //创建一个计时器对象
            Timer t = new Timer();
            t.schedule(new TimerTask() {

                @Override
                public void run() {
                    System.out.println("开始扫描");
                    for (Iterator iterator = list.iterator(); iterator.hasNext();) {
                        HttpSession session = (HttpSession) iterator.next();
                        long l = System.currentTimeMillis() - session.getLastAccessedTime();
                        if(l > 5000){
                            System.out.println("session移除了"+session.getId());
                            session.invalidate();
                            iterator.remove();
                        }
                    }
                }
            }, 2000, 5000);    
    }
}

XMPP中的电子名片简介(来自网络…)


在Extensions中有XEP-0054恢宏,提供了一种可以透过XMPP发送电子名片的机制。

  • vCard,也叫Versitcard,vCard的常用文件扩大名是.vcf。在XMPPFramework中通过XMPPvCardTemp和XMPPvCardCoreDataStorage六个类来实现。
  • vCard是电子名片的文件格式标准,一般附加在电子邮件之后,但也可以用来其他场面,比如在因特网上互相交流。

此处自己要说一下在XMPPFramework中电子名片的多少个有关的类.其中,XMPPv
CardTempModule这一个类使用做电子名片的读取和仓储,XMPPvCardCoreDataStorage用来做电子名片的地头存储,XMPPvCardAvatarModule是用来做头像的储存和读取的,XMPPvCardTemp则是电子名片.

这里我要说一下有关XMPPvCardTemp相关的习性,XMPPvCardTemp是电子名片类.用户的电子名片就是XMPPvCardTemp对象.这里我就把多少个常用的属性列举出来.当然了,大家得以自己对内部一些性能举行仓储修改,大家假如了解我们在哪一个特性存储了什么样数据即可,比如我们让nickname(标准化姓名)存储一个地方字符串,然后取出来nickname的时候,我们了然是nickname存储的是什么即可.灵活运用XMPPvCardTemp的各个属性.

//头像图片属性
@property (nonatomic, strong) NSData *photo;
//标准化名称
@property (nonatomic, strong) NSString *nickname;
//地址数组
@property (nonatomic, strong) NSArray *addresses;
//公司名称
@property (nonatomic, strong) NSString *orgName;
//部门数组
@property (nonatomic, strong) NSArray *orgUnits;
//职位
@property (nonatomic, strong) NSString *title;
//邮件地址数组
@property (nonatomic, strong) NSArray *emailAddresses;
//备注
@property (nonatomic, strong) NSString *note;

</br>

二、Filter

 

XMPPFramework中电子名片相关的法子求证


下边是XMPPFramework中与电子名片相关的主意(下述的拥有办法都在在X
MPPvCardTempModule类中).

小心:❗️❗️❗️最终一个是代理方法,我们调用前多少个情势在收获到电子名片数据之后,会调起最后的特别代理方法.

//到服务器上请求联系人名片信息 
- (void)fetchvCardTempForJID:(XMPPJID *)jid; 

//请求联系人的名片,如果数据库有就不请求,没有就发送名片请求 
- (void)fetchvCardTempForJID:(XMPPJID *)jid ignoreStorage:(BOOL)ignoreStorage; 

//获取联系人的名片,如果数据库有就返回,没有返回空,并到服务器上抓取 
- (XMPPvCardTemp *)vCardTempForJID:(XMPPJID *)jid shouldFetch:(BOOL)shouldFetch; 

//更新自己的名片信息 
- (void)updateMyvCardTemp:(XMPPvCardTemp *)vCardTemp; 

//获取到联系人的名片信息的回调 
- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp forJID:(XMPPJID *)jid

</br>

二、Filter过滤器(重要)

Javaweb中的过滤器可以阻碍所有访问web资源的伏乞或响应操作。

1.1、步骤:

  1. 创建一个类实现Filter接口
  2. 重写接口中方法  doFilter方法是确实过滤的。
  3. 在web.xml文件中配置

留意:在Filter的doFilter方法内如若没有执行chain.doFilter(request,response),那么资源是不会被访问到的。

电子名片的业务流程


地方我们对电子名片进行了简单的介绍,那么接下去咱们就SDChat这多少个Demo中的电子名片的得到以及安装来展开业务流程表明.流程分为三大部分.(PS:高清图片过大,请下载再拓展查看.)

甭管是做哪些,我们都亟待先在SDXmppManager激活对应的模块.在SDXmppManager我们要阐明多少个特性,分别是电子名片本地存储类特性XMPPvCardCoreDataStorage电子名片读取存储属性XMPPvCardTempModule
以及电子名片的头像模块XMPPvCardAvatarModule.

@property(nonatomic,strong)XMPPvCardTempModule *vCardTempModule;
@property(nonatomic,strong)XMPPvCardCoreDataStorage *vCardCoreDataStorage;
@property(nonatomic,strong)XMPPvCardAvatarModule *vCardAvatarModule

接下来在SDXmppManager的先导化过程中对六个特性对象举办初阶化并且激活电子名片模块以及头像模块.

        self.vCardCoreDataStorage = [XMPPvCardCoreDataStorage sharedInstance];
        self.vCardTempModule = [[XMPPvCardTempModule alloc]initWithvCardStorage:self.vCardCoreDataStorage];
        [self.vCardTempModule activate:self.stream];
        [self.vCardTempModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
        self.vCardAvatarModule = [[XMPPvCardAvatarModule alloc]initWithvCardTempModule:self.vCardTempModule];
        [self.vCardAvatarModule activate:self.stream];
        [self.vCardAvatarModule addDelegate:self delegateQueue:dispatch_get_main_queue()];

</br>

用户注册过程中的电子名片设置

用户在登记过程中就可能需要设置电子名片,我们在SDXmppManager单例的起始化过程中形成电子名片模块激活之后,在SDRegisterVC那些类中,大家报了名成功以后,在登记成功之后,咱们在注册成功的代办方法(-(void)xmppStreamDidRegister:(XMPPStream *)sender)中登录注册的账号密码(我以为应该可以直接上传的,然而本人怕出现问题,就让登录之后在上传电子名片数据,我们可以自行测试).代码如下所示.

-(void)xmppStreamDidRegister:(XMPPStream *)sender{

    [[SDXmppManager defaulManager] loginWithUserName:self.loginName.text AndPassWord:self.passWord.text];
}

当登录成功之后,我们在签到成功的代办方法(- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender)中新建一个XMPPvCardTemp对象并上传工作,代码如下所示.

XMPPvCardTemp *myCard = [XMPPvCardTemp vCardTemp];
    myCard.nickname = self.userName.text;
    [[SDXmppManager defaulManager].vCardTempModule updateMyvCardTemp:myCard];

并且弹出头像设置页面跳转的弹窗.

    UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"设置头像" message:@"设置属于自己的头像" preferredStyle:UIAlertControllerStyleAlert];
    __weak typeof(self)temp = self;
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"好的,没问题" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        [temp.navigationController pushViewController:[SDRegisterHeaderVC new] animated:YES];


    }];

    [alertView addAction:action];

    [self presentViewController:alertView animated:YES completion:nil];

跻身头像设置页面之后,大家得以默认给用户一张图纸,当用户不举办安装的时候,默认上传的头像图片就是默认图片,这里自己就肆意找了一张图片,然后大家给UIImageView对象添加一个轻点手势.让用户点击图片的时候可以切换图像.

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickHeaderView)];
[self.headerView addGestureRecognizer:tap];
self.headerView.userInteractionEnabled = YES;

大家在点击事件中加上打开系统的图库以及系统的相机的章程并且增长代理方法,假诺不知底什么样开辟系统相机或者相册,能够查看五指山论剑之浅谈iOS调用大乱斗(电话,短信,浏览器,相机,相册).那么大家就足以由此代理方法来取获得大家的图形,代理方法如下所示.

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;

在代理方法中,我们需要注意一个问题,假设我们遵照雁荡山论剑之浅谈iOS调用大乱斗(电话,短信,浏览器,相机,相册)来赢得图片的话也许取得图片是变形的,大家需要把从info字典中收获图片的key值UIImagePickerControllerOriginalImage换成UIImagePickerControllerEditedImage;

        UIImage* image = [info objectForKey:@"UIImagePickerControllerEditedImage"];

咱俩把图纸保存在SDRegisterHeaderVC的性质对象headerImg当中,然后在用户点击”完成”时候,大家就会调用SDXmppManager获取到当前报到账号的d电子名片对象.

    XMPPvCardTemp *vCard = [SDXmppManager defaulManager].vCardTempModule.myvCardTemp;

然后我们把开展削减,修改图片的尺寸,(注意:❗️❗️❗️图片过大的时候,可能会产出图片上传败北的气象,所以我们把它举行图片的修改),这里我提供了一个图片修改的情势并且用它对我们的头像图片举办了尺寸修改.

- (UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize{

    UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));

    [image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)];

    UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return reSizeImage;

}

UIImage *headerimage = [self reSizeImage:self.headerImg toSize:CGSizeMake(100, 100)];

修改完图片的尺寸之后,大家就对头像图片举办二级制文件的文本转换(那里只拿PNG格式图片作表明,具体还有JPEG格式的,请查看Demo源码),然后把头像文件更新到Openfire服务器中.代码如下所示.

data = UIImagePNGRepresentation(headerimage);
vCard.photo = data;

[[SDXmppManager defaulManager].vCardTempModule updateMyvCardTemp:vCard];

终极,我们关闭与服务器之间的连日,跳转到登录界面.

[self dismissViewControllerAnimated:YES completion:nil];
[[SDXmppManager defaulManager] disconnectWithServer];

</br>

用户登录之后电子名片的收获(过程在SDContactsVC中贯彻)

地点我们说到何等在用户的挂号过程中对用户的电子名片举行设置,那么大家在报到成功未来什么收获用户的头像,名称以及好友的用户头像,名称呢?大家先用代理方法来兑现获取电子名片的方法.

率先,我们需要在联络人界面起头化方法中添加电子名片的相关代理.如下所示.

[[SDXmppManager defaulManager].vCardAvatarModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
[[SDXmppManager defaulManager].vCardTempModule addDelegate:self delegateQueue:dispatch_get_main_queue()];

进而,大家在得到每一个好友节点的代办方法中赢拿到相知节点所对应的JID音信,然后我们运用SDXmppManager中的vCardTempModule调起- (void)fetchvCardTempForJID:(XMPPJID *)jid ignoreStorage:(BOOL)ignoreStorage
方法就可以调起代理方法来.代码如下所示.

[[SDXmppManager defaulManager].vCardTempModule fetchvCardTempForJID:jid ignoreStorage:YES];

下一场,大家经过下述代理方法的回调,咱们可以获拿到JID以及相应的电子名片音信.

- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule
        didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp
                     forJID:(XMPPJID *)jid 

只是,那里不仅能取得到相知的数码,而且登录者的电子名片也足以经过这多少个代理方法举办获取,所以我们要判断区分.假诺是登录者的JID,那么我们把收获到电子音讯名片存储到SDUser那个单例当中方便其他地点获取,如要是忘年交的JID,那么我们就遍历大家的至交节点数组,然后经过比对JID消息,把相应的电子名片添加到Model中去,然后刷新当前的好友列表页面
.全体的代码如下所示.

    if ([jid.user isEqual:[SDUser defaulUser].jid.user]) {

        [SDUser defaulUser].vCard = vCardTemp;
        [self.userInformationView reloadAllData];

    }else{

        for (NSString * key in self.contactsPinyinDic) {
            NSMutableArray *array = [NSMutableArray arrayWithArray:self.contactsPinyinDic[key]];
            for (SDContactModel *model in array) {
                if ([model.jid isEqual:jid]) {
                    model.vCard =vCardTemp;
                }
            }
          }

        //刷新页面
        [self networkingWithContactsArray];
    }

</br>
上述的是经过代理方法来实现好友以及登陆者本身的电子名片获取.下边大家看一下咋样通过XMPPvCardTempModule这些类来展开电子名片的获取.

先是,我们依旧在收获每一个好友节点的代办方法中得到到相知节点所对应的JID信息,然后大家利用SDXmppManager中的vCardTempModule调起- (XMPPvCardTemp *)vCardTempForJID:(XMPPJID *)jid shouldFetch:(BOOL)shouldFetch;那一个法子来.直接获得到相知自己的电子名片音讯,代码如下所示/

XMPPvCardTemp *vCard =  [[SDXmppManager defaulManager].vCardTempModule vCardTempForJID:jid shouldFetch:YES];

那么,我们什么直接拿到登陆者本身的电子名片数据吧?我们直接行使SDXmppManager就可以直接拿走到登陆者本身电子名片本身.

XMPPvCardTemp *myCard = [SDXmppManager defaulManager].vCardTempModule.myvCardTemp;
NSString *userName = [NSString stringWithFormat:@"  昵称: %@",myCard.nickname];
NSData *imgData = myCard.photo;

骚栋中期也是直接得到电子名片数据的,不过那样直白拿到电子名片数据是有必然弊端的,这就是取得服务器中电子名片数据是有自然时间的,如若在页面刷新在此以前还没有获取到数量的话,那么在页面上数据像是就为空了,所以指出接纳代理回调方法来举办好友数据的获取.(SDChat中三种方法都是富有保存的.)

</br>

登录之后设置电子名片流程

用户在登录之后,跟注册过程看似,也是足以设置相应的电子名片数据的.首先我们拿到到登录者的电子名片,如下所示.

XMPPvCardTemp *myCard = [SDXmppManager defaulManager].vCardTempModule.myvCardTemp;

接下来,大家修改电子名片中的属性.这里拿名称来比喻表达.

myCard.nickname = textField.text;

最终,咱们上传到服务器上举行更新.

[[SDXmppManager defaulManager].vCardTempModule updateMyvCardTemp:myCard];

只是这里需要小心的是代理方法的回调问题,咱们怎么精晓我们的好友已经进展了头像的改变或者说是电子名片的改动呢?这就需要实现两个代理方法,一个是我们地点说到收获到相知节点的电子名片回调方法,另外一个就是取得好友节点的头像更改的代理回调方法,六个艺术如下所示.(前提,大家先要在起头化过程中安装代理)

//获取到好友节点的电子名片回调方法
- (void)xmppvCardTempModule:(XMPPvCardTempModule *)vCardTempModule
        didReceivevCardTemp:(XMPPvCardTemp *)vCardTemp
                     forJID:(XMPPJID *)jid 

//获得好友节点的头像更改的代理回调方法
- (void)xmppvCardAvatarModule:(XMPPvCardAvatarModule *)vCardTempModule
              didReceivePhoto:(UIImage *)photo
                       forJID:(XMPPJID *)jid

在措施中,咱们需要区分处理,我们当拿到到登录者本身的电子名片的改动该怎么做,大家吸纳牵连人中电子名片又该怎么操作,需要我们按照实际情况来进展处理.

好了上述就是电子名片的相关这是获取和装置,当大家成功未来,我们就足以等到上边的界面了,相比较于只呈现JID确实是美观了成千上万啊~~

个人菜单

葡京娱乐注册,知音列表

</br>

1.2、FilterChain

FilterChain 是 servlet
容器为开发人士提供的目的,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用
FilterChain
调用链中的下一个过滤器,假若调用的过滤器是链中的末尾一个过滤器,则调用链末尾的资源。

题材:怎么着可以形成一个Filter链?

  只要三个Filter对同一个资源拓展阻挠就足以形成Filter链

题目:怎么着确定Filter的举行各样?

  由<filter-mapping>来确定

结束


地方基本就是XMPPFramework中电子名片的连锁技能点了,固然其他童鞋有疑问,欢迎提出,骚栋分外欢迎各位童鞋前来互换.下一篇我准备写写XMPPFramework中逻辑最多的莫逆之交添加和删除模块,希望我们不断关注骚栋,谢谢.最后把SDChat的传送门送给我们.我们可以对照着Demo来看本篇博客.

1.3、Filter生命周期

Servlet生命周期:

实例化 –》 初始化 –》 服务 –》 销毁

  • 1 当服务器启动,会创建Filter对象,并调用init方法,只调用一回.
  • 2
    当访问资源时,路径与Filter的阻碍路径匹配,会实施Filter中的doFilter方法,这多少个点子是确实拦截操作的方法.
  • 3 当服务器关闭时,会调用Filter的destroy方法来展开销毁操作.

–>SDChat传送门🚪

</br>

1.4、FilterConfig

在Filter的init方法上有一个参数,类型就是FilterConfig.

FilterConfig它是Filter的配置对象,它可以完成下列效能

  1. 获取Filtr名称
  2. 收获Filter开端化参数
  3. 获取ServletContext对象。

葡京娱乐注册 1

题目:如何在Filter中获取一个FIlterConfig对象?

 1 package com.itheima.filter;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 
12 public class MyFilterConfigTest implements Filter{
13 
14     private FilterConfig filterConfig;
15 
16     public void init(FilterConfig filterConfig) throws ServletException {
17         this.filterConfig = filterConfig;
18     }
19 
20     public void doFilter(ServletRequest request, ServletResponse response,
21             FilterChain chain) throws IOException, ServletException {
22         //通过FilterConfig对象获取到配置文件中的初始化信息
23         String encoding = filterConfig.getInitParameter("encoding");
24         System.out.println(encoding);
25         request.setCharacterEncoding(encoding);
26         //放行
27         chain.doFilter(request, response);
28     }
29 
30     public void destroy() {
31         // TODO Auto-generated method stub
32     }
33 }

如下 web.xml配置
<filter>
    <filter-name>MyFilterConfigTest</filter-name>
    <filter-class>com.itheima.filter.MyFilterConfigTest</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>MyFilterConfigTest</filter-name>
    <servlet-name>ServletDemo2</servlet-name>
</filter-mapping>

1.5、Filter配置

着力配备

<filter>
<filter-name>filter名称</filter-name>
<filter-class>Filter类的包名.类名</filter-class>
</filter>
<filter-mapping>
<filter-name>filter名称</filter-name>
<url-pattern>路径</url-pattern>
</filter-mapping>

 

有关其他配置

1.<url-pattern>

一心匹配   以”/demo1”开头,不包含通配符*

目录匹配   以”/”开端  以*结束

恢宏名匹配  *.xxx  无法写成/*.xxx

2.<servlet-name>

它是对点名的servlet名称的servlet举办拦截的。

3.<dispatcher>

可以取的值有  REQUEST  FORWARD  ERROR  INCLUDE    依照跳转情势阻挠

它的机能是:当以如何方法去访问web资源时,举办阻挠操作.

1.REQUEST
当是从浏览器间接访问资源,或是重定向到某个资源时开展阻拦模式配置的
它也是默认值

2.FORWARD 它讲述的是请求转发的阻拦方式配置

3.ERROR
假设目标资源是透过表明式异常处理体制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

4.INCLUDE
一旦目的资源是透过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用

 三、自动登录  (PS bean的属性名和数据库里的字段名千万要一律哦 不然会emmm 很惨)

  1. 当用户登陆成功后,判断是否勾选了电动登陆,即便勾选了,就将用户名与密码持久化存储到cookie
  2. 做一个Filter,对亟待活动登陆的资源举行拦截

首写要在登录Servlet中登录成功时把登录的信息保存在cookie里,并设置存活时间

if(null != user){
            String autologin = request.getParameter("autologin");

            Cookie cookie = new Cookie("user", user.getUsername()+"&"+user.getPassword());
            cookie.setPath("/");
            if(autologin != null){// on / null
                cookie.setMaxAge(60*60*24*7);
            }else{
                cookie.setMaxAge(0);
            }
            response.addCookie(cookie);
            request.getSession().setAttribute("user", user);
            request.getRequestDispatcher("/home.jsp").forward(request, response);
        }

 然后装置好filter类 记住要在web.xml里面配备  如下 为 doFilter代码

public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        //1、转换对象
        HttpServletRequest req = (HttpServletRequest) arg0;
        //2、处理业务
        Cookie[] cookies = req.getCookies();
        String username = "";
        String password = "";
        for (int i = 0;cookies!=null && i < cookies.length; i++) {
            if("user".equals(cookies[i].getName())){
                String value = cookies[i].getValue();
                String[] values = value.split("&");
                username = values[0];
                password = values[1];
            }
        }
        UserService us = new UserService();
        User user = us.findUser(username, password);
        if(user != null){
            req.getSession().setAttribute("user", user);
        }
        //3、放行
        arg2.doFilter(arg0, arg1);
    }