目录
前言
小滴课堂,旨在让编程不在难学,让技术与生活更加有趣。 随着互联网+的时代,在线教育技术越来越便捷,小滴课堂依托在线教育时间以及空间上的便利,为广大IT从业者提供了更为方便、快捷的学习交流途径、提供大量高质量的IT在线课程。更多教程请访问xdclass.net(添加VX:xdclass99)
第十章 Javaweb开发核心知识之Filter过滤器
第1集 初识Servlet过滤器Filter
简介:讲解JavaWeb核心知识之过滤器Filter
-
什么是过滤器:(检验是否符合要求,或者 对内容做二次处理,设置编码响应等)
- filter简单理解:人--->检票员(filter)---> 景点
-
Servlet里面的过滤器作用
- 动态地拦截请求和响应,变换或使用包含在请求或响应中的信息
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
-
Filter的生命周期
- init(FilterConfig filterConfig) //只容器初始化的时候调用一次,即应用启动的时候加载一次
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 只要命中过滤规则就触发,可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法, 即是否让目标资源执行
- destroy() //只容器销毁的时候调用一次,即应用停止的时候调用一次
-
元注解: @WebFilter
//该Filter是否支持异步操作模式
asyncSupported
//指定Filter对那种dispatcher模式进行过滤 该属性支持 Async,Error Forward,include,request
dispatcherType
//Filter 显示的名称
displayName
//Filter的名称
filterName
//Filter的配置参数
initParams
//过滤的Servlet可以指定多个,表示对这几个特定的的servlet 进行过滤
servletNames
//指定 Filter拦截的 URL,和上面的servletNames配置一样,用*可以表示通配符,但是不用字母后加*,应该按照模块划分,比如/user/*
urlPatterns/value
- 过滤器拦截实战
@WebFilter(filterName = "xxx",urlPatterns = {"/*"})
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CustomFilter init ");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("CustomFilter doFilter ");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//让请求继续往下走
chain.doFilter(request,response);
}
@Override
public void destroy() {
System.out.println("CustomFilter destroy ");
}
}
第2集 Servlet Filter 配置参数详解
简介:讲解JavaWeb核心知识之过滤器Filter
-
FilterConfig类:
- 过滤器配置类,可以通过这个获取过滤器基本信息
-
dispatcherTypes 参数
-
指定Filter对那种dispatcher模式进行过滤,不符合的则不进行过滤
- REQUEST:默认值,浏览器直接请求的资源会被过滤器拦截
- FORWARD:转发访问资源会被过滤器拦截
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
-
-
实操
@WebFilter(filterName = "xxx",urlPatterns = {"/*"},initParams = {
@WebInitParam(name = "encoding",value = "UTF-8"),
@WebInitParam(name = "loginPage",value = "/login.jsp"),
},dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
public class CustomFilter implements Filter {
private FilterConfig filterConfig;
private String encoding;
private String loginPage;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CustomFilter init ");
this.filterConfig = filterConfig;
String filterName = filterConfig.getFilterName();
System.out.println("filterName="+filterName);
this.encoding = filterConfig.getInitParameter("encoding");
this.loginPage = filterConfig.getInitParameter("loginPage");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("CustomFilter doFilter ");
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=utf-8");
//让请求继续往下走
chain.doFilter(request,response);
}
@Override
public void destroy() {
System.out.println("CustomFilter destroy ");
}
}
第3集 过滤器实战之Filter用户登录访问个人页面拦截
简介:过滤实战之用户登录访问订单页面
- 开发登录Servlet
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
String pwd = req.getParameter("pwd");
if(name.equals("xdclass") && pwd.equals("123")){
User user = new User();
user.setId(121);
user.setName(name);
user.setHost("xdclass.net");
req.getSession().setAttribute("loginUser",user);
req.getRequestDispatcher("/WEB-INF/user.jsp").forward(req,resp);
}else{
req.setAttribute("msg","账号密码错误");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
-
开发登录过滤器
@WebFilter(filterName = "loginFilter",urlPatterns = {"/user/*","/order/*"},initParams = { @WebInitParam(name = "encoding",value = "UTF-8"), @WebInitParam(name = "loginPage",value = "/login.jsp"), }) public class LoginFilter implements Filter { private FilterConfig filterConfig; private String encoding; private String loginPage; @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("CustomFilter init "); this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); this.loginPage = filterConfig.getInitParameter("loginPage"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("CustomFilter doFilter "); request.setCharacterEncoding(encoding); response.setCharacterEncoding(encoding); response.setContentType("text/html;charset=utf-8"); HttpServletRequest httpServletRequest = (HttpServletRequest)request; HttpServletResponse httpServletResponse = (HttpServletResponse)response; //session里面有用户信息 if(httpServletRequest.getSession().getAttribute("loginUser") !=null){ chain.doFilter(request,response); }else { httpServletRequest.setAttribute("msg","非法访问,请登录"); httpServletRequest.getRequestDispatcher(loginPage).forward(httpServletRequest,httpServletResponse); } } @Override public void destroy() { System.out.println("CustomFilter destroy "); } }
-
登录界面 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="<%=request.getContextPath()%>/loginServlet" method="post"> 名称:<input type="text" name="name"/> <br/> 密码:<input type="password" name="pwd"/> <input type="submit" value="登录"> 消息提示 ${msg} </form> </body> </html>
-
用户信息界面/user.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> id:${loginUser.id} <br> name:${loginUser.name} <a href="/logout_servlet">退出</a> </body> </html>