一、过滤器
上一篇我们说了登录,但是这个还是不行,我们现在的这个可以直接绕过登录,直接请求 success.jsp 也是可以的,说明这个登录根本没有什么用,如果是 success.jsp 里面有一些重要的东西,那只要是个人都可以去看,这个就不好了
所以,我们引入一个东西,叫过滤器,我们把没有登录的用户进行拦截,让他们看不到,登录的人呢,就可以看
过滤器呢,实际上是一个接口,因为过滤的内容不同,肯定会有许许多多的过滤器,这个就和污水排放类似,我们来看一个图
可以看到啊,这个污水排放需要经过层层流程,过滤,最后出水
我们的程序也是一样,需要有多种过滤器,我们就弄个简单的登录过滤器,感受一下
首先我们创建一个 LoginFilter,这个就是我们登录过滤器
然后让这个类实现一个接口,也就是我们的 Filter 接口
这里注意导入的包,不要导错了,是 javax 下面的,不要搞成别的!!!
这里的 request 和 response 和我们之前使用的 HttpServletRequest / Response 是不同的,不要搞混了!!
后面的 FilterChain 是一个过滤器链,如果还有其他的过滤器链,它会继续往下执行,具体的执行,大家可以自己去研究~
然后我们可以看到很熟悉的内容,init 是初始化,destory 是销毁,这两个我们不需要管,我们只需要看中间的 doFilter,这个是我们要来写的
首先第一步,我们获取一下登录人的信息,如果登录了,那么我们就不管他了,如果没有登录,那么我们需要让这个人去登录
废话不多说,直接上代码
这里的这个强转是没有问题的,大家可以放心执行,然后获取 session 中的这个 user 属性,这里我们需要他登录成功后,给他弄个这个 user 属性,现在我们项目中没有,我们一会去加上它
然后判断一下,如果这个 user 是空,我们就让他去登录,如果不是,就继续往下执行~
接着,我们再去 web.xml 配置一下,不然这个东西不生效,配置的方式和 Servlet 很类似,只不过标签名称不一样而已
我们弄个登录的 loginFilter,然后让它作用在所有的请求上,也就是说,所有的请求都会进入到我们的这个过滤器中,这也和上面的废水处理厂中的水是一样的,不管从哪里来的水,都得进行第一步处理~
接着我们修改一下 LoginServlet,登录成功后向 session 中添加一个 user 的属性
然后我们启动项目测试一下,看看那里有问题
可以看到啊,这个 login.jsp 还是可以进入的,我们现在进入 success.jsp 这个页面
可以看到这个地址 success.jsp ,但是却显示的登录,我们现在输入账号密码进行登录
可以看到登录之后,我们还是在这个登录页面,这个是怎么回事?
其实是这样的,我们再请求 success.jsp 的时候,被我们的过滤器过滤出来了,因为没有登录,所以被过滤器弄到了我们的登录页面
然后我们输入账号密码之后再进行登录的时候,我们又进入了过滤器中,因为我们还是获取不到登录信息,所以又被过滤器弄出来了,这样,就变成了死循环,我们永远都登录不了
所以,我们需要将登录的这个请求放开,如果请求的是登录,我们让过滤器不要管,如果不是,再进行转发到登录页面
如果 没有登录,而且不是请求的 /login,直接我们让他跳转到/login
我们再来测试一下
OK的啊~~
二、监听器
监听器呢,主要是来监听数据变化的,就好比上面的用户登录,我们就可以监听到当前是谁登录的
我们呢,先来往数据库添加一条数据
然后,我们一会进行不同用户登录,我们来看看监听器是否监听到谁登录了
然后我们去创建一个监听器:LoginListener,然后让他实现 HttpSessionAttributeListener这个接口
因为我们的登录信息是存储在 session,所以我们需要监听 session 的 Listener,如果是 request 或者是 application,我们需要实现其他的接口
如果要监听 request ,我们需要实现 ServletRequestAttributeListener
如果要监听 application,我们需要实现 ServletContextAttributeListener
然后我们怎么监听呢?
先来说一下这三个方法,一个是 session 中的属性添加的时候,我们进行监听一下,removed 是移除的时候我们监听,replaced 是替换的时候监听~
我们可以往里面加点代码,然后我们来进行配置,同样啊,这东西不配置,也是不起作用~
配置到 web.xml 中之后,我们可以从新启动一下服务器,我们来看看效果
我们可以看到,登录之后,我们这个监听有了作用,现在我们再去登录也面,登录一下 user
可以看到啊,这次是替换,并不是添加!!!
如果我们想要移除,我们就需要清理掉 session 中 user 的属性,这里我就不写了,留给大家去写~~~
大家可以自己好好查查看,有不懂的可以联系我 QQ:2100363119
欢迎大家访问我的网站:https://www.lemon1234.com
可以的话关注一下我的公众号,就在我网站,每天都有更新~~~,无限资源畅游 Java,感谢~
最近小程序也开放了,大家可以扫码进行玩玩看