一、过滤器
import org.apache.commons.lang3.StringUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
/**
* 过滤器的生命周期
* 1、初始化
* 当容器第一次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 Filter Config 对象的引用。
* 2、过滤
* 过滤器的大多数时间都消耗在这里。doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的引用。
* 然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 Filter Chain 对象引用上的 doFilter方法),之后在处理控制权返回该过滤器时处理响应。
* 3、析构
* 容器紧跟在垃圾收集之前调用 destroy()方法,以便能够执行任何必需的清理代码。
* **/
public class myFilter implements Filter {
//该方法由Web容器调用以向过滤器指示它正在停用服务。
public void destroy() {
}
//由于是在链末端的客户端请求,所以每当通过链路传递请求/响应对时,容器就会调用此方法。
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
String ipAddress = req.getRemoteAddr();
//获得IP 与 时间
System.out.println("IP " + ipAddress + ", Time " + new Date().toString());
/**
* 他的作用是将请求转发给过滤器链上下一个对象。这里的下一个指的是下一个filter,
* 如果没有filter那就是你请求的资源。 一般filter都是一个链,web.xml 里面配置了几个就有几个,一个一个的连在一起。
* chain.doFilter(req, resp);
*/
//可以用来解决登录问题
if(((HttpServletRequest)req).getSession().getAttribute("username")!=null){
//用户已经登录 转向下一个过滤器
chain.doFilter(req,resp);
}else{
//用户未登录
//获取位置
String url=((HttpServletRequest)req).getRequestURI();
//限制他的位置
if(!StringUtils.endsWith(url, "login.jsp")){
//继续请求
chain.doFilter(req,resp);
}else{
//转到登录地址
((HttpServletResponse)resp).sendRedirect(((HttpServletRequest) req).getContextPath()+"/login.jsp");
}
}
}
//该方法由Web容器调用,向过滤器指示它正在投入使用。
public void init(FilterConfig config) throws ServletException {
//获取web.xml中的配置参数
String urls=config.getInitParameter("urls");
System.out.println("filter init");
System.out.println(urls);
}
}
二、xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--filter 一般放在最顶端-->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>myFilter</filter-class>
<init-param>
<!--使用这个方法获取参数config.getInitParameter("urls")-->
<param-name>urls</param-name>
<param-value>HAHAHAHHAHAHAHAHAH</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<!--表示对所有的jsp都加过滤器-->
<url-pattern>/*</url-pattern>
</filter-mapping>