Filter作用:
- 对客户端所传递的参数做前置处理,如编码转换。
- 对用户的权限进行检查,登录验证。
过滤器的生命周期
和Servlet一样,过滤器的生命周期分为四个阶段。
- 实例化,实现javax.servlet.Filter接口。
- 读取过滤器的初始化函数,调用init()方法。
- 完成对请求或过滤的响应,调用doFilter()方法。
- 销毁过滤器,调用destroy()方法。
1、编码过滤,解决中文乱码问题
package com.mipo.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//编码过滤
public class EncodingFilter implements Filter {
public EncodingFilter() {
}
//当服务不在使用该filter功能的时候被web容器调用,此后的web请求将不在进行doFilter中的处理。
public void destroy() {
}
//当客户端请求服务资源或是回复的时候调用该方法进行filter功能处理。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
chain.doFilter(request, response);
}
//当servlet容器创建该filter实例的时候调用该方法进行初始化设置。
public void init(FilterConfig fConfig) throws ServletException {
}
}
2、登录验证,防止未经登录直接访问
package com.mipo.filter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//登录验证
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpSession session = req.getSession();
//如果第一次请求不是登录页面,那就对session中内容进行检查;如果是登录页面就不检查,避免造成循环重定向
if(!"login.jsp".equals(req.getContextPath().endsWith("login.jsp"))) {
//如果session为null或session中没有登录者的信息,重定向到登录页面
if(null == session || null == session.getAttribute("user")) {
res.sendRedirect(req.getContextPath()+"/login.jsp");
//结束运行
return;
}
}
//session中的内容与登录者信息匹配,则继续往下执行
chain.doFilter(req, res);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
Filter在web.xml中的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>过滤器</display-name>
<!-- 先进行编码过滤 -->
<servlet>
<servlet-name>encoding</servlet-name>
<servlet-class>com.mipo.servlet.EncodingFilter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>encoding</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- 再进行登录验证 -->
<filter>
<filter-name>login</filter-name>
<filter-class>com.mipo.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>