实现sessionfilter_对Filter和Session的理解与学习

Filter简介:

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

doFilter方法:

Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,让一段代码执行。

是否调用目标资源(即是否让用户访问web资源)。

调用目标资源之后,让一段代码执行。

web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个

doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,

否则web资源不会被访问。

在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。

Filter接口中最重要的方法doFilter是传递请求,响应和过滤器链对象。该方法可以执行以下操作。

检查request headers。

如果希望过滤器修改request headers或data,请自定义请求对象。

如果希望过滤器修改 response headers或data,则自定义响应对象。

调用过滤器链中的下一个实体。如果当前过滤器是以目标Web组件或静态资源结尾的链中的最后一个过滤器,则下一个实体是链末尾的资源; 否则,它是WAR中配置的下一个过滤器。过滤器通过调用doFilter链对象上的方法调用下一个实体,传入请求和响应。

或者,过滤器可以选择通过不调用下一个实体来阻止请求。在后一种情况下,过滤器负责填写响应。在调用链中的下一个过滤器后检查 response headers。抛出异常以指示处理中的错误。

除此之外doFilter,你必须实现init和destroy方法。

@WebFilter(filterName="log",urlPatterns={"/*"})//filterName指定该Filter的名称,urlPatterns指定该Filter所拦截的URL

public class LogFilter implementsFilter

{//FilterConfig可用于访问Filter的配置信息

privateFilterConfig config;//实现初始化方法

public voidinit(FilterConfig config)

{this.config =config;

}//实现销毁方法

public voiddestroy()

{this.config = null;

}//执行过滤的核心方法

public voiddoFilter(ServletRequest request,

ServletResponse response, FilterChain chain)//此方法的最后一个参数是FilterChain对象,此参数是用来调用servlet或JSP页。

throwsIOException,ServletException

{//---------下面代码用于对用户请求执行预处理---------//获取ServletContext对象,用于记录日志

ServletContext context = this.config.getServletContext();long before =System.currentTimeMillis();

System.out.println("开始过滤...");//将请求转换成HttpServletRequest请求

HttpServletRequest hrequest =(HttpServletRequest)request;//输出提示信息

System.out.println("Filter已经截获到用户的请求的地址: " +hrequest.getServletPath());//Filter只是链式处理,请求依然放行到目的地址

chain.doFilter(request, response);//---------下面代码用于对服务器响应执行后处理---------

long after =System.currentTimeMillis();//输出提示信息

System.out.println("过滤结束");//输出提示信息

System.out.println("请求被定位到" + hrequest.getRequestURI() +

" 所花的时间为: " + (after -before));

}

}

Session:

在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

每次我们访问一个页面,如果有开启session,也就是有session_start() 时,就会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入一个名字为PHPSESSID的变量,它的值正是session_id,当这次会话没结束,再次访问的时候,服务器会去读取这个cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成cookie。由于默认生成的这个cookie是会话,也就是说关闭浏览器就会过期掉,所以,下次重新浏览时,会重新生成一个session_id。

这个是session_id,就用来标识绑定一个用户的,既然session_id生成了。那么当我们往session里面写入数据,那么它是怎么存的呢?

同样也是用到session_id。session_id是32位的,服务器会用 sess_前缀 + session_id 的形式存在这个临时目录下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值