JSP&Servlet 过滤器
2017-07-27 11:47
197 查看
继承Filter生成的类:
init() 这是过滤器的初始化方法,web容器创建过滤器实例后将调用这个方法,这个方法中可以读取web.xml文件中过滤器的参数。
doFilter() 这个方法完成实际的过滤操作。这个地方是过滤器的核心方法。当用户请求访问与过滤器有关联的url时,web容器将先调用过滤器的doflilter方法。filterchaiin参数可以调用chain.dofilter方法,将请求传给下一个过滤器,或利用转发,重定向将请求转发到其他资源。
diestory() web容器在销毁过滤器实例前用该方法,在这个方法中可以释放过滤器占用的资源。
创建一个新的类FristFilter,继承自javax.servlet.Filter;
配置文件:
在过滤器的doFilter方法中添加:
可以实现跳转,当访问index.jsp时,该网页会跳转到main.jsp。
服务器启动时先执行init方法,启动完成后加载doFilter方法,在doFilter方法中添加System.out.println("star");
arg2.doFilter(arg0, arg1);
System.out.println("end");
然后在index.jsp中添加输出语句"index.jsp"
在访问index.jsp,会输出结果:
star
index.jsp
end
过滤器链
设置第二个过滤器,映射地址一致形成一个过滤器链,在每个过滤器中添加标识“1”,“2”
运行结果:
star------1
start-----2
index.jsp
end-------2
end-------1
过滤器的类型;
REQUEST
默认类型:用户直接访问页面时,web容器将会调用过滤器。
在刚才的基础上,把第二个过滤器的配置注释掉之后,在第一个过滤器添加一个配置代码:
这样运行之后:如果采用上面的重定向,程序会进入死循环,无限start,end。采用转发的方式则不会。
因为转发的方式走的是第二种filter类型FORWORD。
FORWORD:
目标资源是通过RequestDispatcher的forword访问时,该过滤器将被调用
在FirstFilter的/mian.jsp的配置文件中在添加一句 :<dispatcher>FORWARD</dispatcher>
执行转发操作,也会陷入死循环。
INCLUDE:
目标资源是通过RequestDispatcher的include访问时,该过滤器将被调用
只是方法名不一样,同上req.getRequestDispatcher("main.jsp").include(request, response);
ERROR:
目标资源是通过声明式异常处理机制调用时,过滤器将被调用
在配置文件中添加:
error.jsp中输出该页面不存在。
然后创建一个ErrorFilter的类,在其中的doFilter方法中添加输出语句“检测的有错误信息”。
用户在网页上看到“该页面不存在”,控制台可以看到“检测的有错误信息”
这样才程序访问到不存在的页面时
ASYNC
Servlet3.0(javaee1.7)中新加入了一个ASYNC:支持异步处理
在3.0中加入了一个@WebFilter的方式:用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。
新建AysnFilter的Filter,然后在import后添加
在doFilter中添加输出语句。
创建AysnServlet:
配置文件:
运行servlet:
运行servlet跳转到filter执行start,执行arg2.doFilter(arg0, arg1)输出servlet中的时间,然后执行end。这里不会等待线程执行完,而直接打印结果,待线程执行完后,自己在打印结果。
实例:
登陆界面通过servlet判定,登录成功进入success.jsp,登录失败进入fail.jsp,如果其他人知道成功页面的地址可以不用登录就进入页面,这样很不安全,所以这里通过filter进行过滤。
关于filter映射到/*页面:
对Filter的配置:
init() 这是过滤器的初始化方法,web容器创建过滤器实例后将调用这个方法,这个方法中可以读取web.xml文件中过滤器的参数。
doFilter() 这个方法完成实际的过滤操作。这个地方是过滤器的核心方法。当用户请求访问与过滤器有关联的url时,web容器将先调用过滤器的doflilter方法。filterchaiin参数可以调用chain.dofilter方法,将请求传给下一个过滤器,或利用转发,重定向将请求转发到其他资源。
diestory() web容器在销毁过滤器实例前用该方法,在这个方法中可以释放过滤器占用的资源。
创建一个新的类FristFilter,继承自javax.servlet.Filter;
配置文件:
<filter> <filter-name>FristFilter</filter-name> <filter-class>com.filter.FristFilter</filter-class> </filter> <filter-mapping> <filter-name>FristFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在过滤器的doFilter方法中添加:
HttpServletRequest req =(HttpServletRequest) request; HttpServletResponse response2 =(HttpServletResponse) response; //重定向 response2.sendRedirect(req.getContextPath()+"/main.jsp"); //转发 //req.getRequestDispatcher("main.jsp").forward(request, response); //req.getRequestDispatcher("main.jsp").include(request, response);(转发的url地址不会改变,重定向会改变)
可以实现跳转,当访问index.jsp时,该网页会跳转到main.jsp。
服务器启动时先执行init方法,启动完成后加载doFilter方法,在doFilter方法中添加System.out.println("star");
arg2.doFilter(arg0, arg1);
System.out.println("end");
然后在index.jsp中添加输出语句"index.jsp"
在访问index.jsp,会输出结果:
star
index.jsp
end
过滤器链
设置第二个过滤器,映射地址一致形成一个过滤器链,在每个过滤器中添加标识“1”,“2”
运行结果:
star------1
start-----2
index.jsp
end-------2
end-------1
过滤器的类型;
REQUEST
默认类型:用户直接访问页面时,web容器将会调用过滤器。
在刚才的基础上,把第二个过滤器的配置注释掉之后,在第一个过滤器添加一个配置代码:
<filter-mapping> <filter-name>FirstFilter</filter-name> <url-pattern>/main.jsp</url-pattern> </filter-mapping>
这样运行之后:如果采用上面的重定向,程序会进入死循环,无限start,end。采用转发的方式则不会。
因为转发的方式走的是第二种filter类型FORWORD。
FORWORD:
目标资源是通过RequestDispatcher的forword访问时,该过滤器将被调用
在FirstFilter的/mian.jsp的配置文件中在添加一句 :<dispatcher>FORWARD</dispatcher>
执行转发操作,也会陷入死循环。
INCLUDE:
目标资源是通过RequestDispatcher的include访问时,该过滤器将被调用
只是方法名不一样,同上req.getRequestDispatcher("main.jsp").include(request, response);
ERROR:
目标资源是通过声明式异常处理机制调用时,过滤器将被调用
在配置文件中添加:
<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> <filter> <filter-name>ErrorFilter</filter-name> <filter-class>com.imooc.filter.ErrorFilter</filter-class> </filter> <filter-mapping> <filter-name>ErrorFilter</filter-name> <url-pattern>/error.jsp</url-pattern> <dispatcher>ERROR</dispatcher> </filter-mapping>
error.jsp中输出该页面不存在。
然后创建一个ErrorFilter的类,在其中的doFilter方法中添加输出语句“检测的有错误信息”。
用户在网页上看到“该页面不存在”,控制台可以看到“检测的有错误信息”
这样才程序访问到不存在的页面时
ASYNC
Servlet3.0(javaee1.7)中新加入了一个ASYNC:支持异步处理
在3.0中加入了一个@WebFilter的方式:用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。
新建AysnFilter的Filter,然后在import后添加
@WebFilter(filterName="AsynFilter",asyncSupported=true,value={"/servlet/AsynServlet"},dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC})
在doFilter中添加输出语句。
创建AysnServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Servlet执行开始时间:" + new Date()); AsyncContext context = request.startAsync(); new Thread(new Executor(context)).start(); System.out.println("Servlet执行结束时间:" + new Date()); } publ 4000 ic class Executor implements Runnable { private AsyncContext context; public Executor(AsyncContext context) { this.context = context; } @Override public void run() { //执行相关复杂业务 try { Thread.sleep(1000 * 10); //context.getRequest(); //context.getResponse(); System.out.println("业务执行完成时间:" + new Date()); } catch (InterruptedException e) { e.printStackTrace(); } } }
配置文件:
<servlet-name>AsynServlet</servlet-name> <servlet-class>com.imooc.servlet.AsynServlet</servlet-class> <async-supported>true</async-supported> </servlet>
运行servlet:
运行servlet跳转到filter执行start,执行arg2.doFilter(arg0, arg1)输出servlet中的时间,然后执行end。这里不会等待线程执行完,而直接打印结果,待线程执行完后,自己在打印结果。
实例:
登陆界面通过servlet判定,登录成功进入success.jsp,登录失败进入fail.jsp,如果其他人知道成功页面的地址可以不用登录就进入页面,这样很不安全,所以这里通过filter进行过滤。
关于filter映射到/*页面:
private FilterConfig config; public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) arg0; HttpServletResponse response = (HttpServletResponse) arg1; HttpSession session = request.getSession(); String noLoginPaths = config.getInitParameter("noLoginPaths");//获取不予与过滤的页面 String charset = config.getInitParameter("charset");//获取编码方式 if (charset == null) { charset = "UTF-8";//设置默认为utf-8 } //解决编码乱码问题 request.setCharacterEncoding(charset); if (noLoginPaths != null) { String[] strArray = noLoginPaths.split(";"); for (int i = 0; i < strArray.length; i++) { if (strArray[i] == null || "".equals(strArray[i])) continue; if (request.getRequestURI().indexOf(strArray[i]) != -1) { arg2.doFilter(arg0, arg1); return; } } } if (session.getAttribute("username") != null) { arg2.doFilter(arg0, arg1); } else { response.sendRedirect("login.jsp"); } } @Override public void init(FilterConfig arg0) throws ServletException { config = arg0; }
对Filter的配置:
<filter> <filter-name>LoginFilter</filter-name> <filter-class>com.imooc.filter.LoginFilter</filter-class> <init-param> <param-name>noLoginPaths</param-name> <param-value>login.jsp;fail.jsp;LoginServlet</param-value> //不予与过滤的页面 </init-param> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value>//配置编码方式 </init-param> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
相关文章推荐
- Servlet&JSP 第五章 进阶API、过滤器与监听器
- [JSP&JDBC]JDBC+Servlet+过滤器访问登陆实例/servlet之filter过滤器
- [Servlet&JSP] 过滤器的使用
- JSP&Servlet学习笔记(7): 过滤器
- Servlet & JSP 面试题
- struts , jsp问题:javax.servlet.…
- Jsp Servlet配置过滤器Filter
- Servlet&JSP思维导图
- coreservlet&JSP核心编程总结(1)
- Tomcat编译JSP页面生成Servlet文件(*.class & *.java)的存放位置
- jsp读书笔记——servlet过滤器
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!
- JSP&Servlet--SQL语句基础
- jsp&servlet编码问题解决方法
- Servlet & JSP - Decorating Requests and Responses
- jsp-->servlet-->struts
- 显示JSP之前执行servlet(过滤器)
- 2.3Head First Servlet & Jsp——小结(页码)
- Servlet&JSP笔记
- servlet和JSP过滤器Filter