持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
引入
在项目开发时候我们可能会遇到这样的问题,当我们完成一个项目,比如图书管理系统时候,想要登录后才能对图书进行操作,但是当初代代码写完,你却发现一个新的问题,上帝给这个系统关了一个门(要登录),但是开了一扇窗(通过地址直接访问)。如何对他进行避免或者修改,以保证必须登录才能对图书操作?
🌼那么就需要使用过滤器!!!
过滤器
顾名思义,过滤器就是过滤一些东西,不过我们过滤网里面的东西才是我们需要的哦,我们对网里的东西进行处理。 这里可以类别一下滤纸,滤下去的是液体,但是固态会留在滤纸内部,我们对滤纸内部进行处理,找到我们可以直接访问的东西(比如登录),把他放出来。这样我们就可以通过地址访问登录,同时对应图书却不能直接使用地址访问。
即用户访问时而没有权限的用户我们就需要将它过滤掉。
过滤器原理如下图:
当客户端向服务器中的资源发出请求时,会先被过滤器 Filter 拦截处理,之后再将处理后的结果转发给真正的服务器资源( JSP 或 Servlet 等)。此外服务器做出响应前,响应结果也会先被过滤器拦截处理,之后再将处理后的响应转发给客户端。
比如在基于ssm的图书管理系统里面,我们如何实现过滤?
首先在pom.xml引入依赖
<dependency>
<groupId>com.github.pagehelper</groupId
<artifactId>pagehelper</artifactId>
<version>5.2.1</version>
</dependency>
然后在 springmvc配置里面加入我们的过滤器。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**/"/>
<bean class="org.yamiya.util.HanderConverter"></bean>
</mvc:interceptor>
</mvc:interceptors>
“/* */” 表示过滤全部,即所有请求都可以被捕获,放在我们的“org.yamiya.util.HanderConverter”文件里面进行处理。
在这里,我们需要使用到拦截器的前或者后拦截请求处理。
- 什么是拦截器:在AOP中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略
- 为什么需要拦截器:在做身份认证或者是进行日志的记录时,我们需要通过拦截器达到我们的目的。最常用的登录拦截、或是权限校验、或是防重复提交
- 如何用拦截器:在spring中用拦截器需要实现HandlerInterceptor接口或者它的实现子类:HandlerInterceptorAdapter,同时在applicationContext.xml文件中配置拦截器
接下来去新建处理文件并且实现HandlerInterceptor接口
在这里我们需要先拦截,即使用 reHandle 方法。又因为是地址访问拦截,所以需要获取地址 通过request.getRequestURI();或者request.getRequestURL()
然后判断url或者uri里面是不是包含登录地址,如果有,返回true否则false(保证只有登录可以通过地址访问) 因为每次登录其实就会有一个Cookie并且Cookie有时间限制,所以我们可以考虑使用Session来进行验证,如果session.getAttrubute(逻辑里面的封装)为null代表没有登录,转发或者重定向到登录页面,如果不是null,就可以返回true。表示库进行后续操作,即对图书操作。