⑩. 编码
1.
编码之响应编码
2.
请求编码
Filter
1.什么是过滤器
- ①. 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。
- ②. web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
- ③. 作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…
2.
快速入门
- ①. 写一个类实现Filter接口
- ②. 在web.xml中进行配置(或使用注解 )
3.
过滤器细节
1>.web.xml配置
<filter> <filter-name>demo1</filter-name> <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!-- 拦截路径 --> <url-pattern>/*</url-pattern> </filter-mapping>
2>.
过滤器执行流程
- ①. 执行过滤器
- ②. 执行放行后的资源
- ③. 回来执行过滤器放行代码下边的代码
3>.
生命周期(Filter是单例的!)
- ①.
void init(FilterConfig config):
在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源 - ②.
void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)
:每一次请求被拦截资源时,会执行。执行多次 void destroy():
在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
4>.
过滤器配置详解
过滤器配置详解
1.拦截路径配置:
2.拦截方式配置:资源被访问的方式
5>.
过滤器链(配置多个过滤器)
- ①. 执行顺序:如果有两个过滤器:过滤器1和过滤器2
1. 过滤器1(过滤器6开始了)
2. 过滤器2(过滤器7开始了)
3. 资源执行 (index.jsp)
4. 过滤器2(过滤器7结束了)
5. 过滤器1 (过滤器6结束了)
- ②. 过滤器先后顺序问题:
- 注解配置:按照类名的字符串比较规则比较,值小的先执行 * 如: AFilter 和 BFilter,AFilter就先执行了。 - web.xml配置: <filter-mapping>谁定义在上边,谁先执行
4.
登录验证代码实现
(1). 分析:
(2). 代码实现:
/** * 登录验证的过滤器 */ @WebFilter("/*") public class LoginFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println(req); //0.强制转换 HttpServletRequest request = (HttpServletRequest) req; //1.获取资源请求路径 String uri = request.getRequestURI(); //2.判断是否包含登录相关资源路径,要注意排除掉 css/js/图片/验证码等资源 if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet") ){ //包含,用户就是想登录。放行 chain.doFilter(req, resp); }else{ //不包含,需要验证用户是否登录 //3.从获取session中获取user Object user = request.getSession().getAttribute("user"); if(user != null){ //登录了。放行 chain.doFilter(req, resp); }else{ //没有登录。跳转登录页面 request.setAttribute("login_msg","您尚未登录,请登录"); request.getRequestDispatcher("/login.jsp").forward(request,resp); } } // chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } public void destroy() { } }
Listener
步骤:
- ①. 定义一个类,实现ServletContextListener接口
- ②. 复写方法
- ③. 配置
//@WebListener public class ContextLoaderListener implements ServletContextListener { /* * 监听ServletContext对象创建的。ServletContext 对象服务器启动后自动创建 * 在服务器启动后自动调用 * */ @Override public void contextInitialized(ServletContextEvent servletContextEvent) { //加载资源文件 //1.获取ServletContext对象 ServletContext servletContext = servletContextEvent.getServletContext(); //2.加载资源文件 String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation"); System.out.println("...."+contextConfigLocation); //3.获取真实路径 String realPath=servletContext.getRealPath(contextConfigLocation); //4.加载进内存 try { FileInputStream fis=new FileInputStream(realPath); System.out.println(fis); } catch (FileNotFoundException e) { e.printStackTrace(); } System.out.println("ServletContext对象创建了...."); } /* * 在服务器关闭后,ServletContext对象被销毁。当服务器正常关闭后该方法被调用 * */ @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("servletContext对象销毁了....."); } }
web.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_4_0.xsd" version="4.0"> <listener> <listener-class>com.itheima.listener.ContextLoaderListener</listener-class> </listener> <!--指定初始化参数--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext.xml</param-value> </context-param> </web-app>
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <bean></bean>