Java Web之过滤器
2017-05-23 本文已影响49人
MVBin
知识点
1、 含义:过滤器是指对客户端向服务器端的web目标资源发出的请求,以及服务器端所做出的响应进行截取并处理。
2、 生命周期:①实例化(Web容器在部署Web应用程序时对所有过滤器进行实例化,也就是调用过滤器的构造方法)②初始化(实例化完成后立马对其进行初始化,也就是调用过滤器的init())③工作(也就是进行过滤URL,调用过滤器的doFilter())④销毁(web容器关闭时调用过滤器的destroy())
3、 分类:①request过滤器(过滤重定向请求,至少进行两次请求,两次响应,默认的过滤方式)②forward过滤器(过滤请求转发,进行一次请求,一次响应)③include过滤器(针对jsp页面的<jsp:include></jsp:include>
里的路径进行过滤)④error过滤器(过滤web.xml文件中的<error-page></error-page>
里的路径进行过滤)⑤async过滤器(异步过滤器)
字符编码过滤器
首先,在web.xml文件中进行过滤器的配置
<filter>
<!-- 过滤器的名字 -->
<filter-name>encodingFilter</filter-name>
<!-- 过滤器类的完全限定名-->
<filter-class>com.mvbin.filter.CharacterEncodingFilter</filter-class>
<!-- 过滤器类的初始化参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<!-- 过滤器要过滤的请求路径:/* 表示过滤所有路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
其次,编写过滤器类的代码,过滤器继承javax.servlet.Filter,并实现其三个方法
import *****;
//字符过滤器类
public class CharacterEncodingFilter implements Filter {
private String encoding;
//过滤器的销毁方法,在web容器关闭时执行
@Override
public void destroy() {
}
//过滤器真正的核心方法,在这里对响应的请求进行过滤处理
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//将所有的请求的编码格式转化为UTF-8
request.setCharacterEncoding(encoding);
//调用FilterChain的doFilter方法,进行放行
chain.doFilter(request, response);
}
//过滤器的初始化方法,在web容器启动时进行执行
@Override
public void init(FilterConfig config) throws ServletException {
//通过FilterConfig的getInitParameter方法获取web.xml中配置的初始化参数
this.encoding = config.getInitParameter("encoding");
System.out.println("init: " + encoding);
}
}
验证是否登录过滤器
首先,web.xml文件中进行配置
<!-- 验证是否登录过滤器 -->
<filter>
<filter-name>checkLoginFilter</filter-name>
<filter-class>com.mvbin.filter.CheckLoginFilter</filter-class>
<!-- 配置不进行过滤验证的路径 -->
<init-param>
<param-name>noCheckUrl</param-name>
<param-value>index.jsp,user.jspx</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>checkLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其次,编写过滤器代码
import ***;
//CheckLoginFilter类
public class CheckLoginFilter implements Filter {
private String noCheckUrl;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//进行强制类型转换
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//根据,进行字符串分割
String[] urls = noCheckUrl.split(",");
//获取session中是否存在loginUser
User user = (User) req.getSession().getAttribute("loginUser");
//foreach循环进行验证,包含不过滤的路径的话就放行
for (String str : urls) {
String uri = req.getRequestURI();
//css文件及js文件也要可以通过过滤
if(uri.indexOf(str) != -1 || uri.endsWith("css") || uri.endsWith("js")) {
chain.doFilter(request, response);
return;
}
}
//判断user是否为空
if(user == null) {
resp.sendRedirect("index.jsp");
} else {
//不为空则放行
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig config) throws ServletException {
//获取不过滤的路径
this.noCheckUrl = config.getInitParameter("noCheckUrl");
}
}