1·Filter 什么是过滤器
- filter过滤器是Javaweb的三大组件之一
- filter过滤器是javaee规范,即接口
- filter过滤器他的作用是:拦截请求,过滤响应
拦截请求常见的应用场景:
- 权限检查
- 日记操作
- 事务管理
。。。。等等
2·Filter初体验
要求:在你的web工程下,有一个admin目录。这个admin目录下的所有资源(html页面、jpg图片、jsp文件等等)都必须是用户登录过户才能访问。
思考:根据之前我们学过的内容。我们知道,在用户登录之后的登录信息保存在Session域中。所以,要检查用户是否登录,可以判断Session中是否包含用户的登录信息即可
1·编写一个类趋势线Filter接口,并实现过滤方法doFilter
Filter的实现类
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* doFilter方法,专门用于拦截请求、可以做权限检查
*
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest= (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user=session.getAttribute("user");
//如果等于null,说明还没有登录,那么我们转呗一个跳转页面
if(user == null){
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
}else{
//让程序继续访问用户的目录资源
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
2·到web.xml中去配置Filter的拦截路径
<filter>
<!-- //给Filter器一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置Filter的全类名-->
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
<!-- filter-mapping配置filter过滤器的拦截路径 -->
<filter-mapping>
<!-- filter-name表示当前的拦截路径给哪个filter使用 -->
<filter-name>AdminFilter</filter-name>
<!-- url-pattern配置拦截路径 -->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
完整的用户登录
在上面的基础上在加一个HttpServlet的继承类
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setContentType("text/html;charset=UTF-8");
String username=req.getParameter("username");
String password=req.getParameter("password");
if(username.equals("lisan")&&password.equals("1234")){
req.setAttribute("user",username);
resp.getWriter().write("登陆成功");
}else{
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
}
3·Filter的生命周期
Filter的生命周期包含几个方法
- 构造器方法
- init初始化方法
第1,2步,在web工程启动时执行(Filter创建) - doFilter过滤方法
第3步,每次拦截到请求时,就会执行 - destory销毁
第4步,停止web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器)
4·FilterConfig类
1·获取filter的名称filter-name的内容
filterConfig.getFilterName();
2`获取在web.xml中配置的init-param参数
filterCinfig.getInitParameter();
3·获取ServletContext对象
filterConfig.getServletContext();
5·Filter的拦截路径
–精确匹配
<url-pattern>/target.jsp</url-pattern>
以上配置的路径,表示请求地址必须为:Http://ip:/工程路径名/target.jsp
–目录匹配
<url-pattern>/admin/*</pattern>
以上表示请求的地址必须为:http://ip:port/工程路径/admin/*
–后缀名匹配
<url-pattern>*.html</pattern>
以上表示请求的地址必须以html结尾才会拦截到