一、Filter
1.1概述
生活中的过滤器:净水器,空气净化器,土匪、
web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
过滤器的作用:
一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...
执行过程
1.2环境搭建
1 创建filter.实现filter覆写方法
public class InitFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init------");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("doFilter-----");
// 放行,可以继续往下执行
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("destroy-----");
}
}
2、注册和映射
<?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>Filter_01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- filter注册 -->
<filter>
<!-- 名字 -->
<filter-name>InitFilter</filter-name>
<!-- 类全名 -->
<filter-class>com.InitFilter</filter-class>
</filter>
<!-- 映射 -->
<filter-mapping>
<!-- 名字 -->
<filter-name>InitFilter</filter-name>
<!-- 需要拦截过滤的url -->
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
<filter>
<!-- 名字 -->
<filter-name>SecondFilter</filter-name>
<!-- 类全名 -->
<filter-class>com.SecondFilter</filter-class>
</filter>
<!-- 映射 -->
<filter-mapping>
<!-- 名字 -->
<filter-name>SecondFilter</filter-name>
<!-- 需要拦截过滤的url -->
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
</web-app>
当多个filter拦截相同请求时,那个mapping映射在上面,那个执行
1.3 设置字符编码
public class SecondFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("secondFilter--------");
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
1.4 设置字符编码-优化
1.5 登录校验
package com.tledu.zrz.filter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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;
import javax.servlet.http.HttpSession;
@WebFilter("/*")
public class LoginFilter implements Filter {
private List<String> urls = new ArrayList<String>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 项目主页
urls.add("/");
urls.add("/index.jsp");
// 登陆页面和登陆校验
urls.add("/login.jsp");
urls.add("/login");
urls.add("/checkCode");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 类型转换
HttpServletResponse resp = (HttpServletResponse) response;
HttpServletRequest req = (HttpServletRequest) request;
// 1 先知道 那些不登录也可以访问 urls
// 2 获取当前请求的是谁,获取当前请求的url
String url = req.getServletPath();
// System.out.println(url);
// 3 判断当前请求的url是否在urls中
if (!urls.contains(url)) {
HttpSession session = req.getSession();
// 获取登陆的信息
String loginUser = (String) session.getAttribute("loginUser");
// 判断是否有信息
if (loginUser == null || loginUser.trim().equals("")) {
resp.sendRedirect("login.jsp");
return;
}
}
// 放行
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
1.6 登陆校验-优化
放行静态资源文件