(试一试新出的模板)
前言
想象一个情景,我们在浏览淘宝网页的时候,在没有登录的情况下,我们点击收藏某商品,或者是执行一个购买操作,这时马老板会亲切地给我们弹出一个登录界面,提示我们未登录无法执行上述操作.如果对这非常熟悉,好了,那你就成功一半了
一、过滤器是什么?
过滤器,filter,是一种能够拦截请求,并且规定过滤规则的程序,往往先于与之相关的JSP或servlet. 做个不太恰当的比方,有点类似于AOP技术中的前置通知.在执行某一方法前,会自动进行一次其它的操作,比如说验证用户是否登录
二、使用步骤
1.创建filter
我们应该把filter文件专门建在一个存放过滤器的包下
创建的filter文件,会默认实现一个Filter接口,这个接口是由tomcat提供的
系统默认会给出一个构造器,一个初始化方法,一个销毁方法,和一个doFilter方法,当filter拦截到请求时,就会执行doFilter方法来限制或允许用户做登录
生命周期 : 在服务器/容器启动时创建,在服务器容器关闭时销毁
2.拦截
根据过滤条件过滤.即在web.xml中生成的标签里,<url-pattern></~>
就是过滤条件
当我们试图在地址栏中以http://localhost:8888/Filter/LoginFilter
方式进入时,系统发现session为空,也就是还没有登录的时候,会依据doFilter()
方法中规定的重定向目标地址来跳转我们的网页
同时我们要把登录以后才能看到的那一部分页面放在同一个文件夹下
在doFilter()
定义HttpServletRequest
,HttpServletResponse
对象,
用req接收request传来的值,如果没有传值,那么就要res重定向到登录界面
;如果传值了,就进入页面
注 : 1.HttpServletRequest
和HttpServletResponse
与doFilter()方法中给出的参数ServletResponse
和ServletRequest
是父子类的关系,因此在下面的代码中,我们需要对原有的形参进行强制类型转换
2.获取文件根目录: req.getContextPath()
3.getSession()
方法,我们看看它的官方解释👇:
Returns the current session associated with this request,or if the request does not have a session, creates one.
filter代码如下:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
System.out.println("doFilter...");
Object obj = req.getSession().getAttribute("username");