web中filter的用法,java中filter作用
00-1010 1.概念2。基本用法3。生命周期4。过滤器配置类别5。滤波器链6级。拦截路径7。ThreadLocal过滤器管理事务7.1 ThreadLocal7.2 MySQL事务前提7.3过滤器统一管理7.4错误消息显示
00-1010过滤器过滤器是JavaWeb的三个组件之一。三个组件:Servlet、监听器和过滤器
Filter是JavaEE的规范,也就是接口。
角色:拦截请求并过滤响应。
拦截常见应用场景:
权限检查日记帐操作事务管理…
目录
示例:在您的web项目下,需要有一个管理目录。所有资源(html、jpg、jsp等。)必须在用户登录后才能访问。
根据之前所学,用户登录后,我们将用户信息保存到会话域中,这样就可以判断会话中是否包含用户信息。但是,这种模式只能在jsp页面中使用,可以在任何资源上使用(在获取目标资源之前执行过滤器):
编写一个类来实现过滤器接口。
//写一个类实现javax.servlet.filter公共类admin filter实现filter {//这个方法很重要,主要用来拦截请求!(权限检查)@ override public void do filter(servlet request servlet response,filter chain filter chain)抛出io异常,servlet exception { http servlet request req=(http servlet request)servlet request;//进行强旋转得到会话http servlet响应resp=(http servlet响应)servlet响应;http session session=req . getsession();//Get session object user=session . Get attribute( user );if(user==null){ req . getrequest dispatcher(/log in . JSP )。转发(请求,响应);//不登录转发到登陆页面返回;} else {//如果已经登录,有下一个过滤器就输入,没有就放开,访问用户请求的资源!(没有这行不行)filterChain.doFilter(req,resp);} }//下面两个可以实现@ override public void init(filter config filter config)抛出servlet异常{ } @ override public void destroy(){ } } XML配置过滤器(类似于Servlet)
!-configure filter-filter-name admin filter/filter-name!-给Filter起个名字-Filter-class com . Sutong . Filter . admin Filter/Filter-class!-完整类名-/filter filter-映射filter-name admin filter/filter-name!-指示当前截取路径用于哪个过滤器-!-intercept path,斜杠表示项目路径并映射到web目录,admin/*表示管理目录中的所有资源-URL-pattern/admin/*/URL-pattern/filter-mapping。
1. 概念
过滤方法执行顺序:
构造函数方法init()初始化方法,前两步在web工程中开始。
动的时候已经执行(即Filter已经创建)doFilter()
,每次拦截到请求就会执行destroy()
,停止web的时候执行
4. FilterConfig类
FIlterConfig,Filter过滤器的配置文件类,Tomcat每次创建的Filter的时候,会同时创建一个FilterConfig类。
作用:获取Filter过滤器的配置内容
获取Filter的名称,即配置文件中filter-name
标签里面的内容获取Filter在web.xml中配置的init-param
初始化参数 (在filter标签里面配置初始化参数,和Servlet一样)获取ServletContext
对象
@Overridepublic void init(FilterConfig filterConfig) throws ServletException { String filterName = filterConfig.getFilterName(); // 1 String value = filterConfig.getInitParameter("key1"); // 2 ServletContext servletContext = filterConfig.getServletContext(); // 3}
5. FilterChain类
FilterChain 是过滤器链(多个过滤器一起工作)
filterChain.doFilter(req, resp)
该方法是作用:
执行下一个Filter(如果有)执行目标资源(没有了Filter了)如果验证通过,执行完目标资源后会返回 doFilter 方法调用的地方,继续执行下面的代码。
当多个过滤器时,拦截同一个文件/目录时,Filter 配置文件的顺序(即web.xml中的配置顺序)决定了每 Filter 的执行顺序,配置在前先执行。
当多个过滤器的特点:⭐
所有的 Filter 和目标资源默认都执行在同一个线程中多个 Filter 共同执行的时候他们都使用一个 Request 对象
6. 拦截路径
精确匹配
<url-pattern>/target.jsp</url-pattern>
--> http://ip:port/工程路径/target.jsp
目录匹配
<url-pattern>/admin/*</url-pattern>
-> http://ip:port/工程路径/admin/*
后缀名匹配
<url-pattern>*.html</url-pattern>
-> 表示要拦截的地址必须以 .html结尾
这个后缀名不一定是现有文件的后缀名,是个字符串就行 *.abc
也行。注意不是以斜杠开头
Filter只关系请求的地址是否匹配,不关心资源是否存在。
7. ThreadLocal+Filter管理事务
7.1 ThreadLocal
ThreadLocal是jdk1.2开始的,作用:可以解决多线程的数据安全问题
ThreadLocal可以给当前线程关联一个数据(可以是普通变量,对象,集合等)
(可以简单理解为,像Map一样,当前线程名为key,关联的数据为value)
如果想要给当前线程关联多个数据则需要多个ThreadLocal实例,ThreadLocal实例一般都是 static 类型,其中保存的数据在线程销毁后由JVM虚拟机自动释放。
// Hashtable线程安全public static Map<String, Object> map = new Hashtable<>(); // ThreadLocal泛型就是关联数据的类型,类似:Map中V的类型,K是当前线程// 只能关联一个数据,多个则需new多个public static ThreadLocal<Object> threadLocal = new ThreadLocal<>(); // 使用public void test() { map.put(Thread.currentThread().getName(), "Map存数据"); threadLocal.set("ThreadLocal存数据"); // 取数据 Object obj1 = map.get(Thread.currentThread().getName()); Object obj2 = threadLocal.get();}
7.2 MySQL事务前提
我们在book项目的时候,如果生成订单后发生错误,则生成订单成功而订单详情生成失败,这是严重错误的,所以我们要使用事务确保这些操作在一个事务内。
而确保在一个事务的前期是 使用同一个 Connection 连接对象! 这里就可以用 ThreadLocal
了,把Connection
存到ThreadLocal
中,确保多个Service使用的是同一个连接对象。
而使用 ThreadLocal
关联数据要确保上面这些操作在一个线程中执行! (经过验证我们book中生成订单操作都是在一个线程下的)
String orderId = null;try { orderId = orderService.createOrder(cart, loginUser.getId()); JdbcUtils.commitAndClose(); // 生成订单,没异常提交事务关闭连接} catch (Exception e) {JdbcUtils.rollbackAndClose(); // 有异常回滚,关闭连接 !!}// 但这样做每个xxxService.xxx() 都要进行try catch,太麻烦了,可以使用Filter,看下面
7.3 Filter统一管理
使用Filter统一给所有的 Service 方法都加上 try-catch,来实现管理!!
所有的异常都要抛给 Filter,不要私自处理异常
TransactionFilter.java :
public class TransactionFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { try { // 下面这行相当于调用xxxService.xxx()方法, // 所以我们对这行进行try-catch就行了(即给所有的Servlet中的所以方法进行了try-catch) filterChain.doFilter(servletRequest, servletResponse); JdbcUtils.commitAndClose(); // 没异常提交事务,关闭连接 } catch (Exception e) { JdbcUtils.rollbackAndClose(); // 有异常回滚,关闭连接 e.printStackTrace(); // 可以不打印,打印可以让我们开到什么错误 throw new RuntimeException(e); // 再把错误抛给Tomcat去显示我们准备的错误页面!!!!!! // (如果有异常了,用户页面则会一页空白,我们要给用户一点友好的提示!可以交给Tomcat展示友好的错误页面信息) } } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { }}
web.xml
<filter> <filter-name>TransactionFilter</filter-name> <filter-class>com.sutong.filter.TransactionFilter</filter-class></filter><filter-mapping> <filter-name>TransactionFilter</filter-name> <url-pattern>/*</url-pattern> <!-- /* 代表当前工程的所有请求,相当于对工程下的所有请求进行了try-catch--></filter-mapping>
7.4 错误信息展示
TransactionFilter.java
try { filterChain.doFilter(servletRequest, servletResponse); JdbcUtils.commitAndClose(); } catch (Exception e) { JdbcUtils.rollbackAndClose(); throw new RuntimeException(e); // 再把错误抛给Tomcat去显示我们准备的错误页面!!!!!! // (如果有异常了,用户页面则会一页空白,我们要给用户一点友好的提示!可以交给Tomcat展示友好的错误页面信息)}
web.xml配置
<!-- error-page配置服务器出错后,自动跳转的页面--><error-page> <error-code>500</error-code> <!-- 错误类型--> <location>/pages/error/error500.jsp</location> <!-- 要跳转去的页面路径--></error-page><error-page> <error-code>404</error-code> <location>/pages/error/error404.jsp</location> </error-page>
到此这篇关于JavaWeb三大组件之一的Filter详解的文章就介绍到这了,更多相关JavaWeb Filter内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。