Filter接口(过滤器接口)
该接口同Servlet监听器,Http服务器不会提供实现类,需要我们手动实现。
功能:Filter接口在Http服务器调用资源之前,会对Http服务器进行拦截。
作用:帮助Http服务器检测当前请求合法性,或者对当前请求进行增强操作。
实现三步:
1.java类实现接口。
2.重写doFilter方法。
3.注册web.xml。
<filter>
<filter-name>名字</filter-name>
<filter-class>包路径</filter-class>
</filter>
<filter-mapping>
<filter-name>名字</filter-name>
<url-pattern>/资源路径</url-pattern>
</filter-mapping>
注意:是要来着javax.servlet中的Filter类
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
请求拦截:
这里的ServletRequest与ServletResponse对象都是从Http服务器拦截下来的,我们可以对其进行操作,而FilterChain则是拦截的"通道",可以通过chain.doFilter(request,response)
方法来返还(放行)。
请求增强:
应用场景:使用post的请求方式的请求协议包,参数会储存在请求体中,Tomcat读取请求体信息时,会使用请求对象进行读取,而请求对象的默认编码集是ios-859,如果请求体中有中文将会出现乱码,因此我们会使用req.setCharacterEncoding(utf-8)
来设置请求体读取的字符集。如果有很多个Servlet对象来处理post方式的请求协议包,那么我们都需要在doPos写上req.setCharacterEncoding(utf-8)
,200个Servlet要写200次,很麻烦,我们可以使用过滤器,来进行处理。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
request.setCharacterEncoding(utf-8);
chain.doFilter(request,response);
}
过滤器拦截地址格式
<filter-mapping>
<filter-name>OneFilter</filter-name>
<url-pattern>拦截地址</url-pattern>
</filter-mapping>
拦截地址就是Tomcat调用何种文件时,需要进行OneFilter过滤
拦截地址书写格式:
1./img/background.png
对img文件夹中的background.png进行过滤。
2./img/*
对img文件夹中的所有文件进行过滤。
3./img/*.png
对img文件夹中的.png格式的文件进行过滤。
4./*
调用任意文件夹都需要调用过滤器。
过滤器防止用户恶意登录
用户通过url地址直接跳过登录进入其他界面,为恶意登录。
通过令牌机制解决恶意登录问题。
原理:在用户登录时,登录在登录的servlet中为该用户发放令牌,当该用户访问其他页面时,需要出示登录时发放的令牌才能进行访问。
使用会话作用域对象来作为令牌。
在登录成功后使用请求体的getSession()
获取HttpSession
对象。
当浏览器登录成功调用其他对象时都需要使用getSession(false);
如果用户是正常登录的,则可以获取Session
对象,可以访问界面,若用户不是正常登录则无法获取Session
对象。
如果我们都在每个Servlet对象都加上getSession(false)
语句来判断用户是否登录会显得很麻烦,而且使用这种方法无法保护静态资源文件,所以我们可以将所有需要登录才能够访问的文件在过滤器中同一使用getSession(false)
简化操作也能保护静态资源文件。