特别说明:如果能帮助到您,请您留下点滴痕迹,让我知道我的存在是有意义的;如果不能帮助到您,请接受我的歉意;
1、使用Filter完整流程
(1)、Filter对用户请求进行预处理;
(2)、接着将请求交给Servlet进行处理并生成响应;
(3)、最后Filter再对服务器响应进行后处理;
2、Filter用处
(1)、在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest;
(2)、根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据;
(3)、在HttpServletResponse到达客户端之前,拦截HttpServletResponse;
(4)、根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据;
3、创建Filter步骤
(1)、创建Filter处理类;
(2)、web.xml配置Filter;
4、Filter类方法(必须实现javax.servlet.Filter接口)
(1)、init(FilterConfig config):完成Filter初始化;
(2)、destroy():用于在Filter销毁前,完成某些资源的回收;
(3)、doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实现过滤功能;
=>AuthorityFilter.java
package lee;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.*;
/**
* AuthorityFilter_class
* description:通过doFilter方法来设置request编码字符集;验证用户是否登录;
* date:14:13 2014-10-29
* @author cyb_23
* @version 1.0
*/
@WebFilter(filterName="authority"
, urlPatterns={"/*"}
, initParams={
@WebInitParam(name="encoding", value="GBK"),
@WebInitParam(name="loginPage", value="/login.jsp"),
@WebInitParam(name="proLogin", value="/proLogin.jsp")})
public class AuthorityFilter implements Filter
{
//FilterConfig可用于访问Filter的配置信息
private FilterConfig config;
//实现初始化方法
public void init(FilterConfig config)
{
this.config = config;
}
//实现销毁方法
public void destroy()
{
this.config = null;
}
//执行过滤的核心方法
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException,ServletException
{
//获取该Filter的配置参数
String encoding = config.getInitParameter("encoding");
String loginPage = config.getInitParameter("loginPage");
String proLogin = config.getInitParameter("proLogin");
//设置request编码用的字符集
request.setCharacterEncoding(encoding); //①
HttpServletRequest requ = (HttpServletRequest)request;
HttpSession session = requ.getSession(true);
//获取客户请求的页面
String requestPath = requ.getServletPath();
//如果session范围的user为null,即表明没有登录
//且用户请求的既不是登录页面,也不是处理登录的页面
if( session.getAttribute("user") == null
&& !requestPath.endsWith(loginPage)
&& !requestPath.endsWith(proLogin))
{
//forward到登录页面
request.setAttribute("tip" , "您还没有登录");
request.getRequestDispatcher(loginPage)
.forward(request, response);
}
//"放行"请求
else
{
chain.doFilter(request, response);
}
}
}
=>web.xml
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- 定义Filter -->
<filter>
<filter-name>authority</filter-name>
<filter-class>lee.AuthorityFilter</filter-class>
<!-- init-param配置参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>loginPage</param-name>
<param-value>/login.jsp</param-value>
</init-param>
<init-param>
<param-name>proLogin</param-name>
<param-value>/proLogin.jsp</param-value>
</init-param>
</filter>
<!-- 定义Filter拦截的URL地址 -->
<filter-mapping>
<filter-name>authority</filter-name>
<!-- Filter负责拦截的URL -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>