Web过滤器
例子:访问网站的时候,访问一些需要登陆的内容时会自动跳转到登陆界面,这就是常见的身份验证的安全控制过滤器。
过滤器的作用:
实现对web资源请求的拦截,完成特殊的操作,尤其是对请求的预处理。
web资源包括{JSP,Servlet,图片,文件}
过滤器常见的应用场景:
Web资源权限访问控制
请求字符集编码处理
内容敏感字符词汇过滤
响应信息压缩
工作流程:
|过滤器|
客户端 -> 请求预处理 -> servlet.service()
客户端 <- 响应后处理 <- servlet.service()
过滤器的生命周期:
web应用程序启动时,web服务器创建Filter的实例对象,以及对象的初始化
当请求访问与过滤器关联的web资源时,过滤器拦截请求,完成指定功能。
Filter对象创建后回驻留在内存,在web应用移除或服务器停止时才销毁
过滤器的创建和销毁有WEB服务器负责
过滤器的实现步骤:
1. 编写java类实现Filter接口,并实现其doFilter方法
2. 在web.xml 文件中对Filter类进行注册,并设置所拦截的资源
过滤器链:
在一个web应用中,多个过滤器组合起来称之为一个过滤器链
过滤器的调用顺序取决于过滤器在web.xml文件中的注册顺序,也即是决定了预处理的顺序
过滤器的使用:
在web.xml文件中加上:
<!--注册过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>filter.CharacterEncodingFilter</filter-class>
<!--简单的配置filter初始化参数init()中传入的config对象-->
<init-param>
<param-name>systemName</param-name>
<param-value>filter Encoding</param-value>
</init-param>
<init-param>
<param-name>version</param-name>
<param-value>1.0</param-value>
</init-param>
<init-param>
<param-name>CharacterEncoding</param-name><!--设置编码格式-->
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern><!--要对所有的请求都做编码集处理,所以用/*-->
</filter-mapping>
filter-mapping 中还有一个子元素 dispather:
如果用户直接访问页面的时候,浏览器就认为时REQUEST方式(默认),
通过include访问另一个页面,那么就是用INCLUDE方式,
如果资源通过requestdispatcher方法访问时,就是调用FORWARD方式,
如果资源通过声明异常机制调用的时候,就是ERROR方式。
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWORD</dispatcher> 就是提供了两种访问方式会调用filter过滤器
然后是过滤器的编写:
package filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter {
private FilterConfig config;
//一般来说,get,set方法没什么用,只是习惯性的加上,如果没有也没问题
public void setConfig(FilterConfig config) {
this.config = config;
}
public FilterConfig getConfig() {
return config;
}
public void destroy() {
//销毁类方法,销毁过滤器对象
System.out.println("销毁对象");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
// //完成过滤器功能
// //request 做一个请求的预处理,reponse 响应后的处理,FilterChain 过滤器链对象,所有的过滤器做了一个封装,变成chian参数,传到过滤器对象中,通过调用chain对象中的doFilter方法,通知服务器请求预处理操作已完成,或者通知过滤器链中的下一个过滤器
// String systemName = config.getInitParameter("systemName");
// String version = config.getInitParameter("version");//获取初始化参数
// //web.xml文件中的初始化值改变,config的值也会跟着改变
// request.setCharacterEncoding(config.getInitParameter("CharacterEncoding"));//设置编码-0
// chain.doFilter(request, response);//用于通知服务器请求拦截操作完成,进行下一步操作
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;//因为过滤器中很多都和HTTP请求有关,所以转化一下
String loginUser = (String) ((HttpServletRequest) request).getSession().getAttribute("loginUser");
if(loginUser == null){
httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/index.jsp?flag=1");
}else {
chain.doFilter(httpServletRequest,httpServletResponse);
}
}
public void init(FilterConfig config) throws ServletException {
//初始化方法,对过滤器进行一些操作 FilterConfig过滤器配置类 设置一些初始化参数,初始化过滤器
//init函数只在最开始创建的时候调用一次
System.out.println("初始化filter方法");
this.config = config;//获取系统传入的config对象
}
}
1177

被折叠的 条评论
为什么被折叠?



