Filter过滤器
Filter接口
- init()方法:获取初始化信息
- doFilter()方法:执行过滤器
- destory()方法:销毁
编写过滤器
- 编写java类实现Filter接口
- 重写doFilter方法
- 设置拦截的url
过滤器的配置
注解式配置
//拦截特定的页面
@WebFilter(value="/index.jsp")
//拦截所有的HTML或者jsp页面
@WebFilter(value={"*.html","*.jsp"})
//拦截所有的页面
@WebFilter("/*")
xml文件配置Filter
<!-- 配置filter -->
<filter>
<!-- 设置filter的名字 -->
<filter-name>myfilter</filter-name>
<!-- 设置filter的类 -->
<filter-class>com.qf.web.filter.MyFilter3</filter-class>
<!-- 初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
</filter>
<!-- filter映射文件 -->
<filter-mapping>
<filter-name>myfilter</filter-name>
<!-- 设置路径 -->
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
注意: 多个拦截器的执行顺序
- 注解式:按照字典顺序实行
- xml文件:按照配置的顺序执行
过滤器的初始化参数
1. 基于注解式的初始化
//注解配置初始化信息
@WebFilter(value= {"*.jsp","*.html"},initParams= {@WebInitParam(name="name",value="zhangsan")})
2. 基于xml文件配置初始化信息
<!-- 初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
调用初始化参数
//初始化方法
public void init(FilterConfig fConfig) throws ServletException {
//获取初始化参数
String name = fConfig.getInitParameter("name");
System.out.println(name);
}
执行过滤器doFilter
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("过滤前...");
//请求的过程 request
//放行目标资源的访问
chain.doFilter(request, response);
//响应的过程 response
System.out.println("过滤后...");
}
案例
案例1:禁止浏览器缓存动态页面
对于目前的浏览器,get请求动态资源缓存问题已解决
对于静态资源,部分浏览器使用Cache-Control头和Expires头设置缓存时间。
代码实现:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//动态jsp资源的缓存
//将servletResponse类型强转成HttpServletResponse类型
HttpServletResponse resp = (HttpServletResponse) response;
//设置有限期-1 禁止浏览器缓存所有动态页面
resp.setDateHeader("Expires", -1);
resp.setHeader("Pragma", "no-cache");
//resp.setHeader("Cache-Control", "no-cache"); // no-cache 服务器返回304
resp.setHeader("Cache-Control", "no-store");//no-store 浏览器不存储缓存
chain.doFilter(request, resp);
System.out.println("执行了....");
}
案例2:自动登录
代码实现
LoginServlet类
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取数据
String username = request.getParameter("username");
String pwd = request.getParameter("password");
if (username.equals("admin")&&pwd.equals("888")) {
//创建用户
User user = new User(0, username, pwd);
//获取session,将用户信息放入session 中
request.getSession().setAttribute("user", user);
//创建cookie,放入用户信息
Cookie cookie = new Cookie("userinfo",username+"#"+pwd);
cookie.setMaxAge(60*5);
cookie.setHttpOnly(true);
//添加cookie
response.addCookie(cookie);
//用户名和密码正确,重定向到主页面
response.sendRedirect(request.getContextPath()+"/index.jsp");
}else {
//用户名和密码不正确,转发到登录页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
LoginFilter类
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse) response;
//先判断有没有登录-----没有关闭浏览器
System.out.println("11111111111111111");
HttpSession session = req.getSession();
User user = (User) session.getAttribute("user");
if (user!=null) {
resp.sendRedirect(req.getContextPath()+"/index.jsp");
return;
}
System.out.println("222222222222222222222222");
//获取cookie-----关闭浏览器session中的消息消失
Cookie[] cookies = req.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("userinfo")) {
String[] strings = cookie.getValue().split("#");
if (strings[0].equals("admin")&&strings[1].equals("888")) {
user = new User(0, strings[0], strings[1]);
//将信息再次放入session 中
session.setAttribute("user", user);
resp.sendRedirect(req.getContextPath()+"/index.jsp");
return;
}
}
}
}
chain.doFilter(request, response);
}