Java过滤器的使用和拦截排除的实现
Java过滤器Filter使用详解
Java过滤器Filter使⽤详解<div id="post_detail">转载请注明原⽂地址:在我的项⽬中有具体应⽤:https:///ygj0930/CoupleSpace过滤器过滤器是处于客户端与服务器资源⽂件之间的⼀道过滤⽹,在访问资源⽂件之前,通过⼀系列的过滤器对请求进⾏修改、判断等,把不符合规则的请求在中途拦截或修改。
也可以对响应进⾏过滤,拦截或修改响应。
如图,浏览器发出的请求先递交给第⼀个filter进⾏过滤,符合规则则放⾏,递交给filter链中的下⼀个过滤器进⾏过滤。
过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。
当请求通过了链中所有过滤器后就可以访问资源⽂件了,如果不能通过,则可能在中间某个过滤器中被处理掉。
在doFilter()⽅法中,chain.doFilter()前的⼀般是对request执⾏的过滤操作,chain.doFilter后⾯的代码⼀般是对response执⾏的操作。
过滤链代码的执⾏顺序如下:过滤器⼀般⽤于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重⽤,不必每个servlet中还要进⾏相应的操作。
下⾯是过滤器的简单应⽤:1:创建过滤器如图,新建⼀个class,实现接⼝Filter(注意:是javax.servlet中的Filter)。
2:重写过滤器的doFilter(request,response,chain)⽅法。
另外两个init()、destroy()⽅法⼀般不需要重写。
在doFilter⽅法中进⾏过滤操作。
常⽤代码有:获取请求、获取响应、获取session、放⾏。
剩下的代码就是根据session的属性进⾏过滤操作、设置编码格式等等了,看情况⽽定。
HttpServletRequest request=(HttpServletRequest) arg0;//获取request对象HttpServletResponse response=(HttpServletResponse) arg1;//获取response对象HttpSession session=request.getSession();//获取session对象过滤操作代码......chain.doFilter(request, response);//放⾏,通过了当前过滤器,递交给下⼀个filter进⾏过滤3:在web.xml中配置过滤器。
java使用过滤器实现登录拦截处理
java使⽤过滤器实现登录拦截处理⽬录滤器实现登录拦截处理⼀、什么是过滤器⼆、⼯作原理及⽣命周期三、过滤器使⽤filter简易实现登录功能拦截LoginFlitercontroller结果图滤器实现登录拦截处理⼀、什么是过滤器过滤器是处于客户端与服务器资源⽂件之间的⼀道过滤⽹(驻留在服务器端的Web组件),在访问资源⽂件之前,通过⼀系列的过滤器对请求进⾏修改、判断等,把不符合规则的请求在中途拦截或修改。
也可以对响应进⾏过滤,拦截或修改响应⼆、⼯作原理及⽣命周期举个例⼦当我们登录系统可以访问到页⾯,当退出登录后,要访问就必须重新登录,这就是过滤器起到的作⽤。
当我们访问某个接⼝时,过滤器会拦截请求,判断当前⽤户是否是登录状态,若登录则放⾏访问,若未登录则返回指定页⾯(通常为登录页或⼀个客户友好的提⽰页)这个过程包含了过滤器的⽣命周期:1.实例化2.初始化3.执⾏过滤操作(包括访问前对request操作和返回时对response的操作处理)4.销毁三、过滤器使⽤在springboot项⽬简单使⽤过滤器进⾏登录拦截处理1.实现过滤器public class MyFilter implements Filter {private static final String CURRENT_USER = "current_user";//配置⽩名单protected static List<Pattern> patterns = new ArrayList<Pattern>();//静态代码块,在虚拟机加载类的时候就会加载执⾏,⽽且只执⾏⼀次static {patterns.add(pile("/index"));patterns.add(pile("/login"));patterns.add(pile("/register"));}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(httpResponse);String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());if (isInclude(url)) {//在⽩名单中的url,放⾏访问filterChain.doFilter(httpRequest, httpResponse);return;}if (SessionUtils.getSessionAttribute(CURRENT_USER) != null) {//若为登录状态放⾏访问filterChain.doFilter(httpRequest, httpResponse);return;} else {//否则默认访问index接⼝wrapper.sendRedirect("/index");}}@Overridepublic void destroy() {}//判断当前请求是否在⽩名单private boolean isInclude(String url) {for (Pattern pattern : patterns) {Matcher matcher = pattern.matcher(url);if (matcher.matches()) {return true;}}return false;}}2.注册过滤器@Configurationpublic class WebConfig {/*** 配置过滤器* @return*/@Beanpublic FilterRegistrationBean someFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(myFilter());//拦截/*的访问多级匹配(springboot 过滤器/*以及匹配 /**多级匹配)registration.addUrlPatterns("/*");registration.setName("myFilter");return registration;}/*** 创建⼀个bean* @return*/@Bean(name = "myFilter")public Filter myFilter() {return new MyFilter();}}3.运⾏项⽬访问/index,会发现没有被拦截,返回正确结果在未登录状态,访问/update接⼝,会被拦截跳转⾄/index页在登录状态,访问/update接⼝,可以访问这⾥也可以在程序debug看下。
java 中filter过滤器使用方法
Java 中filter 过滤器的使用:Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。
它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。
Filters 有许多的应用场合。
Servlet 2.3 规范建议如下的地方可以应用Filter:authentication filterslogging and auditing filtersimage conversion filtersdata compression filtersencryption filterstokenizing filtersfilters that trigger resource access eventsXSL/T filters that transform XML contentMIME-type chain filters如何实现一个过滤器呢?1.所在的类实现Filter接口public interface Filterpublic void init(FilterConfig filterConfig)throws ServletException过滤器初始化是在容器启动时自动初始化public void doFilter(ServletRequest request,ServletResponse response,FilterChainchain)throws IOException,ServletExcepton在标准Servlet中的doGet或doPost 方法中,传递参数为:HttpServletRequest、HttpServletResponse过滤器销毁public void destroy()例:如下为过滤器基本的主要结构import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class MyFirstFilter implements Filter{private String encoding;public void destroy(){System.out.println("过滤器销毁");}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out .println("过滤doFilter");chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {System.out .println("过滤器初始化"); encoding = filterConfig.getInitParameter("encoding"}对应配置文件:<filter ><filter-name >encodingFilter </filter-name ><filter-class >com.shen.test.filter. MyFirstFilter </filter-class ><init-param ><param-name >encoding </param-name ><param-value >Shift_JIS </param-value ></init-param ></filter ><filter-mapping ><filter-name >encodingFilter </filter-name ><servlet-name >action </servlet-name ></filter-mapping ><servlet ><init-param ><<param-value >/WEB-INF/config/struts-config.xml,/WEB-INF/config/st ruts-config-contents.xml </param-value ></init-param ><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><init-param><param-name>detail</param-name><param-value>2</param-value></init-param><load-on-startup>1</load-on-startup></servlet>如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发过滤器也会执行两次:FilterChain之前执行一次,之后再执行一次2:对某些文字进行过滤关键方法如下所示:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤doFilter");//从页面获取内容String content=request.getParameter("content");String filterchar ="色";if(content != null && !"".equals(content)){//如果indexOf返回-1则表示没有查到所要的内容if(-1 == content.indexOf(filterchar)){chain.doFilter(request, response);}else{System.out.println("有非法文字");//可以继续做处理//如果需要的话,此处依然可以使用RequestDispatcher进行跳转}}}3:设置统一编码/*** 对内容进行统一的编码*/request.setCharacterEncoding("GBK");response.setCharacterEncoding("GBK");4:登录验证:/*** 登陆验证*/public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {/*** 登陆验证*///Session属于http范畴,把以ServletRequest对象需要先转换成HttpServletRequest对象HttpServletRequest hrequest =(HttpServletRequest) request;HttpSession session =hrequest.getSession();//request.getScheme();request.getServerName();request.getServerPo rt();//如果session不为空,则可以浏览其它页面if(null != session.getAttribute("username")){chain.doFilter(request, response);}else{//通过requestDispatcher跳转到登陆面request.getRequestDispatcher("login.jsp").forward(request,respons e);}}第二部分:javax.servlet.Filter详细介绍:过滤器(Filter)位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
java文件的过滤(JFileChooser)
/*使用showOpenDialog()方法,显示出打开选择文件的窗口,当选择了某个文件后,或者关闭此窗口那么都会返回一个
整型数值,如果返回的是0,代表已经选择了某个文件。如果返回1代表选择了取消按钮或者直接关闭了窗口*/
int result = file.showOpenDialog(null);
/*JFileChooser.APPROVE_OPTION是个整型常量,代表0。就是说当返回0的值我们才执行相关操作,否则什么也不做。*/
if(result == JFileChooser.APPROVE_OPTION)
if (extension.equals(ext))
return true;
}
return false;
}
/*这个方法也是重写FileFilter的方法,作用是在过滤名那里显示出相关的信息。这个与我们过滤的文件类型想匹配,通过这些信息,可以让用户更清晰的明白需要过滤什么类型的文件。*/
public static void main(String [] args) {
//首先是创建JFileChooser 对象,里面带个参数,表示默认打开的目录,这里是默认打开当前文件所在的目录。
JFileChooser file = new JFileChooser (".");
MyChooser(String path) {
super(path);
}
/**
* 重载JFileChooser的方法,当在文件选择对话框中,并在当前
Java三大器之拦截器(Interceptor)的实现原理及代码示例
Java三⼤器之拦截器(Interceptor)的实现原理及代码⽰例1,拦截器的概念java⾥的拦截器是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action执⾏前阻⽌其执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。
在AOP中,拦截器⽤于在某个⽅法或者字段被访问之前,进⾏拦截然后再之前或者之后加⼊某些操作。
⽬前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不⽤深究,知道即可。
2,拦截器的原理⼤部分时候,拦截器⽅法都是通过代理的⽅式来调⽤的。
Struts2的拦截器实现相对简单。
当请求到达Struts2的ServletDispatcher时,Struts2会查找配置⽂件,并根据配置实例化相对的拦截器对象,然后串成⼀个列表(List),最后⼀个⼀个的调⽤列表中的拦截器。
Struts2的拦截器是可插拔的,拦截器是AOP的⼀个实现。
Struts2拦截器栈就是将拦截器按⼀定的顺序连接成⼀条链。
在访问被拦截的⽅法或者字段时,Struts2拦截器链中的拦截器就会按照之前定义的顺序进⾏调⽤。
3,⾃定义拦截器的步骤第⼀步:⾃定义⼀个实现了Interceptor接⼝的类,或者继承抽象类AbstractInterceptor。
第⼆步:在配置⽂件中注册定义的拦截器。
第三步:在需要使⽤Action中引⽤上述定义的拦截器,为了⽅便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。
4,过滤器与拦截器的区别过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是⽅法调⽤,⽐如拦截敏感词汇。
4.1,拦截器是基于java反射机制来实现的,⽽过滤器是基于函数回调来实现的。
(有⼈说,拦截器是基于动态代理来实现的)4.2,拦截器不依赖servlet容器,过滤器依赖于servlet容器。
javaweb中的过滤器
day15过滤器〔Filter〕过滤器概述1 什么是过滤器过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。
当用户请求*个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行〞,则会继承执行用户请求的Servlet;如果Filter不“放行〞,则就不会执行用户请求的Servlet。
其实可以这样理解,当用户请求*个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行〞由Filter来决定。
可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。
2 过滤器之hello world其实过滤器与Servlet很相似,我们回忆一下如果写的第一个Servlet应用!写一个类,实现Servlet接口!没错,写过滤器就是写一个类,实现Filter接口。
第二步也与Servlet一样,在web.*ml文件中部署Filter:应该没有问题吧,都可以看懂吧!OK了,现在可以尝试去访问inde*.jsp页面了,看看是什么效果!当用户访问inde*.jsp页面时,会执行HelloFilter的doFilter()方法!在我们的例如中,inde*.jsp页面是不会被执行的,如果想执行inde*.jsp页面,则我们需要放行!有很多同学总是错误的认为,一个请求在给客户端输出之后就算是完毕了,这是不对的!其实很多事情都需要在给客户端响应之后才能完成!过滤器详细1 过滤器的生命周期我们已经学习过Servlet的生命周期,则Filter的生命周期也就没有什么难度了!●init(FilterConfig):在效劳器启动时会创立Filter实例,并且每个类型的Filter只创立一个实例,从此不再创立!在创立完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次;●doFilter(ServletRequest req,ServletResponse res,FilterChain chain):这个方法会在用户每次访问“目标资源〔<url->pattern>inde*.jsp</url-pattern>〕〞时执行,如果需要“放行〞,则需要调用FilterChain的doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain的doFilter()方法,则目标资源将无法执行;●destroy():效劳器会在创立Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁它。
java web中过滤器的实现方法及过程
过滤器是Java Web开发中非常重要的一部分,它可以对请求和响应进行过滤和处理,起到了非常关键的作用。
下面将介绍Java Web中过滤器的实现方法及过程。
一、过滤器的概念及作用1.1 过滤器的概念过滤器是Java Servlet规范中的一个特殊的对象,主要用于对HTTP 请求进行预处理和后处理。
它可以在请求到达Servlet之前预处理request对象,也可以在Servlet生成返回结果之前进行后处理。
1.2 过滤器的作用过滤器在Java Web开发中有着非常重要的作用,它可以实现诸如日志记录、字符编码转换、权限验证、性能监控等功能。
通过过滤器,开发人员可以很方便地实现各种需求。
二、过滤器的实现方法及过程2.1 编写过滤器类我们需要编写一个类,实现javax.servlet.Filter接口。
在这个类中,我们需要重写三个方法:init()、doFilter()和destroy()。
2.2 配置过滤器在web.xml文件中配置过滤器。
在<web-app>标签内部,使用<filter>、<filter-mapping>标签对过滤器进行配置。
在<filter>标签中配置过滤器的名称和类名,在<filter-mapping>标签中配置过滤器的名称以及要过滤的请求路径。
2.3 过滤器的初始化和销毁过程当Web应用启动时,容器会调用过滤器的init()方法进行初始化操作,在这个方法中可以进行一些初始化工作。
当Web应用停止或重启时,容器会调用过滤器的destroy()方法进行销毁操作,在这个方法中可以进行资源的释放操作。
2.4 过滤器的过滤过程当有请求到达时,容器会调用过滤器的doFilter()方法进行过滤操作。
在这个方法中,我们可以对请求进行处理,并且可以在满足条件的情况下将请求传递给下一个过滤器或Servlet,也可以在需要的时候直接对请求进行返回结果。
java过滤器用法
java过滤器用法Java过滤器是Java Servlet规范中的一种组件,用于在请求被送往目标资源之前或响应返回给客户端之前对请求或响应进行处理。
过滤器可以拦截和修改请求和响应的内容,以实现一些需要在请求和响应之间进行处理的功能。
本文将详细介绍Java过滤器的用法,包括如何创建和配置过滤器、过滤器的生命周期以及常见的过滤器使用场景。
一、创建和配置过滤器1. 创建过滤器类在Java web应用中创建过滤器主要通过实现javax.servlet.Filter接口来完成。
首先,创建一个新的Java类并实现Filter接口。
public class MyFilter implements Filter {在这里实现过滤器的逻辑}2. 实现过滤器的逻辑在实现的过滤器类中,需要重写Filter接口中的三个方法:init、doFilter和destroy。
- init方法:在过滤器被加载时调用,用于初始化过滤器。
可以在这个方法中进行一些初始化操作,例如读取配置文件等。
- doFilter方法:用于处理请求和响应,可以在该方法中对请求和响应进行修改和拦截。
该方法接收三个参数:ServletRequest、ServletResponse和FilterChain。
- ServletRequest:表示客户端的请求,可以获取请求的URL、参数和头信息等。
- ServletResponse:表示服务器返回给客户端的响应,可以修改响应的内容和头信息等。
- FilterChain:过滤器链,用于将请求和响应传递给下一个过滤器或目标资源。
- destroy方法:在过滤器被销毁时调用,用于释放资源。
例如,关闭数据库连接等操作。
具体示例代码如下:public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException { 这里进行过滤器的初始化操作,例如读取配置文件等}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {这里进行过滤器的逻辑处理,例如修改请求和响应的内容等将请求和响应传递给下一个过滤器或目标资源chain.doFilter(request, response);}@Overridepublic void destroy() {这里释放过滤器的资源,例如关闭数据库连接等}}3. 配置过滤器要在Java web应用中启用过滤器,需要在web.xml文件中进行配置。
JAVA过滤器的使用(Filter)
JAVA过滤器的使⽤(Filter)request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");这是在Servlet⾥⾯设置字符编码的代码,但是通常情况下Servlet不⽌⼀个,所以我们需要在每⼀个Servlet中都写上上⾯的代码,这样的话,不仅⿇烦,⽽且容易搞混淆。
所以我们对于这类多个Servlet中会执⾏相同的代码的时候,我们通常可以使⽤过滤器来帮我们完成操作:过滤器:如果想要使⽤过滤器,⾸先需要实现Filter类,并重写三个需要的⽅法:import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter(filterName = "TestFilter2",urlPatterns = "/*")public class TestFilter2 implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {chain.doFilter(req, resp);}public void init(FilterConfig config) throws ServletException {}}init⽅法: 容器在创建当前过滤器的时候⾃动调⽤;destroy⽅法: 容器在销毁当前过滤器的时候⾃动调⽤doFilter⽅法: 过滤器的主要代码写在这个地⽅1 @WebFilter(filterName = "TestFilter2",urlPatterns = "/*")这⼀⾏代码的意思是添加⼀个注解,通过这⾏代码就不需要再去web.xml中注册了其中 filterName 代表的是这个过滤器的名字,后⾯那个urlPatterns 代表的是过滤的路径 /* 代表所有路径,意味着访问所有的路径的时候都会先访问这个过滤器chain.doFilter(req, resp);这⼀⾏代码代表的是如果还有其他的过滤器就调⽤其它的过滤器,但是需要注意,这⼀⾏代码必须写在doFilter⽅法的最后⾯1public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {2//这样在每个Servlet执⾏的时候都会先进⾏这个3 HttpServletRequest request = (HttpServletRequest) req;4 HttpServletResponse response = (HttpServletResponse) resp;56 request.setCharacterEncoding("utf-8");7 response.setContentType("text/html;charset=utf-8");89//因为有可能不⽌这⼀个过滤器,所以需要将所有的过滤器执⾏10//注意这⼀⾏代码⼀定要写到最后11 chain.doFilter(req, resp);12 }其中3-7⾏代码就是设置编码由于doFilter传递进来的默认是ServletRequest对象⽽设置字符集的是在HttpServetRequest 所以我们需要强制转换⼀下转换过后我们就可以进⾏设置了。
java_过滤器、监听器_拦截器_原理个人总结
过滤器创建一个Filter 只需两个步骤:(1)创建Filter 处理类:(2)在web.xml 文件中配置Filter 。
创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。
• void init(FilterConfig config): 用于完成Filter 的初始化。
• void destroy(): 用于Filter 销毁前,完成某些资源的回收。
• void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。
在servlet2.4中,过滤器同样可以用于请求分派器,但须在web.xml中声明,<dispatcher>INCLUDE或FORWARD或REQUEST或ERROR</dispatcher>该元素位于filter-mapping中。
一、理解Struts2拦截器1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.解析:--------------------------------------------------------------------------------------------拦截器和AOP的关系拦截器与AOP (Aspect Orient Program ,面向切面编程)是密切相关的,AOP 从程序运行角度来考虑程序的流程,取得业务处理过程的切面,在特定切面通过系统自动插入特定方法。
JAVAWEB中Servlet过滤器的使用
JAVAWEB中Servlet过滤器的使用Servlet过滤器是Java Web中的一种组件,用于对请求和响应进行预处理和后处理。
它可以通过在请求和响应之间添加过滤器链来拦截和处理Web应用程序中的请求和响应。
过滤器的主要作用是对请求进行过滤和修改,可以在请求进入一些Servlet之前拦截请求,对请求参数进行处理、校验或者其他操作,然后再将请求转发给下一个过滤器或者目标Servlet。
同样,过滤器也可以在响应返回客户端之前对响应进行处理,比如对响应的内容进行修改、加密或者压缩等操作。
过滤器的使用可以帮助我们实现一些常见的Web开发功能,如权限验证、字符编码处理、日志记录、缓存控制、跨域请求等。
下面我将详细介绍过滤器的使用方法。
1.创建过滤器类:首先,我们需要创建一个实现Filter接口的过滤器类。
过滤器类需要实现接口中的三个方法:init(、doFilter(和destroy(。
```javapublic class MyFilter implements Filterpublic void init(FilterConfig config) throws ServletException//进行过滤器的初始化操作,比如获取过滤器的配置参数等}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException//进行过滤操作,可以修改请求和响应chain.doFilter(request, response); // 调用下一个过滤器或目标Servlet}public void destro//进行过滤器的销毁操作,比如释放资源等}```2.配置过滤器:在Web应用程序的web.xml文件中配置过滤器,指定过滤器的名称、类名和拦截的路径等信息。
一篇搞定Java过滤器
⼀篇搞定Java过滤器Filter:过滤器引⾔我们可以通过使⽤前⾯的技术,做出⼀些简单的登陆注册以及配合数据库实现对数据增删改查的Demo,程序是基本运⾏起来了,但是却存在着⼀个重⼤的安全问题,那就登陆权限验证,⼀般来说登陆的正确流程是这样的:⽤户在客户端发出请求 -> 后台判断是否登录 -> 是则不限制,否则跳转回登录页⾯,判断是否登录和我们前⾯所学习的 Header中获取referer再判断达从⽽到防盗链的效果有相似的感觉,就是起⼀个判断过滤的样⼦,⽽Filter则是⼀个更好的解决这样问题的技术,当然强⼤的功能不⽌这⼀点,下⾯我们就好好来说⼀说!(⼀) 过滤器概述过滤器,顾名思义就是起到过滤筛选作⽤的⼀种事物,只不过相较于现实⽣活中的过滤器,这⾥的过滤器过滤的对象是客户端访问的web资源,也可以理解为⼀种预处理⼿段,对资源进⾏拦截后,将其中我们认为的杂质(⽤户⾃⼰定义的)过滤,符合条件的放⾏,不符合的则拦截下来当然,过滤器既可以拦截request,也可以拦截返回的response,我们来看⼀张图(⼆) 第⼀个过滤器程序过滤器的本质就是⼀个实现了 Filter 接⼝的 Java 类我们先⾃⼰创建⼀个类,实现Filter接⼝(javax.servlet),重写其中的所有⽅法@WebFilter("/*")public class FilterDemo1 implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//放⾏代码chain.doFilter(req, resp);}public void init(FilterConfig config) throws ServletException {}}我们先不探究其中的⽅法,我们先看⼀下如何配置filter(三) filter配置第⼀种:web.xml配置<filter><filter-name>filterDemo1</filter-name><filter-class>package cn.ideal.web.filter.FilterDemo1</filter-class></filter><filter-mapping><filter-name>filterDemo1</filter-name><!-- 拦截路径 --><url-pattern>/*</url-pattern></filter-mapping>filter<filter-name></filter-name>:指定filter名字<filter-class></filter-class>:指定filter全类名(带包名)filter-mapping<filter-name></filter-name>:这⾥的标签是为了与上⾯filter中的名字对应,从⽽指向到对应的⽂件中<url-pattern></url-pattern>:设置filter所拦截的路径※这⾥决定了什么样的资源会被过滤器拦截处理拦截路径设置格式解释/test.jsp只有访问test.jsp这个资源的时候才会执⾏过滤器/test/*访问test下所有资源你的时候,执⾏过滤器*.jsp所有jsp格式的资源被访问的时候,执⾏过滤器/*任意资源被访问,均执⾏过滤器由于过滤器内设置的是⽐较通⽤的⼀些设置,所以⼀般来说使⽤/*这种格式,不过也可以根据需求情况选择拦截⽅式配置:dispatcher拦截⽅式配置也就是资源被访问的形式,有这么⼏个属性REQUEST:默认值,浏览器直接请求资源FORWARD:转发访问资源 : RequestDispatcher.forward();INCLUDE:包含访问资源 : RequestDispatcher.include();ERROR:错误跳转资源 : 被声明式异常处理机制调⽤的时候补充:声明式异常处理即:在web.xml中通过配置来确定不同的异常类型将如何被处理,最后跳转到哪个页⾯,也就是我们常常看到的⼀些404错误页⾯<error-page><!--异常的类--><exception-type>xxx</exception-type><!--异常发⽣时跳转的页⾯--><location>xxx</location></error-page>第⼆种:使⽤注解配置与servlet相似的配置,我们可以指定它的名字和拦截路径@WebFilter("filterName="FilterDemo1",urlPatters="/*")但是直接在类上声明注解,显然那我们是不需要指定其名字的,⽽通过查看源码⼜可以知道,urlPatters⼜可以被value指定,⽽value⼜可以省略,所以我们可以简写为@WebFilter("/*")若想在filter注解中配置dispatcher,我们需要设置dispatcherTypes属性@WebFilter(value = "/*",dispatcherTypes ={DispatcherType.FORWARD,DispatcherType.FORWARD} )(四) 过滤器的⽣命周期讲完了配置,下⾯我们就回归主题来说⼀说过滤器的⽣命周期,也就是上⾯实现接⼝⽽重写的那些⽅法们⾸先是init(FilterConfig config)⽅法和void destroy()⽅法,Servlet也有这两个⽅法,两者分别在服务器启动和关闭的时候被创建以及销毁,两者均执⾏⼀次,⽤于加载以及释放资源其实就这两个⽅法来说在Servlet的基础上还是很好理解的再者就是我们过滤器的核⼼⽅法了:void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)doFilter⽅法就是我们真正进⾏拦截的⽅法,通过前两个参数我们可以知道,不论是Request亦或是Respone我们都可以对其进⾏过滤操作,那么第三个参数是什么意思呢?我们打开FilterChain的源码public interface FilterChain {void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;}嗯!FilterChain是⼀个接⼝,接⼝内也定义了⼀个doFilter⽅法,它存在的意义是什呢?这是⼀种链式结构,我们在这⾥称作过滤器链,其作⽤就是为了配置多个过滤器,多个过滤器下的执⾏流程是这样的那么,多个过滤器谁前谁后呢?这还与我们前⾯的配置有关注解配置:按照类名字符串⽐较,值⼩的先执⾏Eg:AFilterDemo 优先于 BFilterDemoweb.xml配置:<filter-mapping>中谁在上⾯,谁优先执⾏过滤器的简单执⾏流程执⾏过滤器执⾏放⾏后的资源,可能是下⼀个过滤器,也可能是web资源(JSP/Servlet)执⾏过滤器放⾏代码 chain.doFilter(req, resp);下边的代码(五) Filter的应⽤(1) 登录权限验证我们前⾯的的知识已经能简单的满⾜我们对于登录以及简单注册的实现,但是如果我们知道地址,直接通过url访问⼀些资源,很显然这是很不合理的,所以我们需要对登录状态进⾏验证,未登录则转发到的登录界⾯,登录则可以依据登录状态⾃由访问⼀些页⾯我们写⼀个简单的模拟程序,为了可读性,以及篇幅问题,我们省略数据库连接的部分,采⽤固定的密码这是index.jsp页⾯,也就是需要登录后才能放开访问权限的页⾯<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>$Title$</title></head><body><h1>这是⾸页,只有登录后才能查看</h1></body></html>这是login.jsp页⾯,也就是登录页⾯,⾮常简单<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><form action="/web-test/loginServlet" method="post"><table><tr><td>⽤户名:</td><td><input type="text" name="username"></td></tr><tr><td>密码:</td><td><input type="password" name="password"></td></tr><tr><td><input type="submit" value="登录"></td></tr></table></form></body></html>我们创⼀个domain 包,写⼀个User实体,补充其get、set⽅法package cn.ideal.domain;public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}}下⾯开始编写LoginServlet,也就是处理登录验证问题的代码package cn.ideal.web.servlet;import erDao;import er;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/loginServlet")public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置编码request.setCharacterEncoding("utf-8");//获取请求参数String username = request.getParameter("username");String password = request.getParameter("password");//封装user对象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);UserDao dao = new UserDao();User user = dao.login(loginUser);if (user == null){//登陆失败request.getRequestDispatcher("/failServlet").forward(request,response);}else{//登录成功request.getSession().setAttribute("user",user);request.getRequestDispatcher("/index.jsp").forward(request,response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}我们根据 user 是否等于 null来判断⽤户名密码是否正确,那么我们你就来写⼀下这个返回了⼀个User对象的login⽅法我们在dao层中创建⼀个UserDao类,正式⼀些的项⽬会写成接⼝的形式,在impl层中再写实现,为了掩饰我们简化这⼀步package cn.ideal.dao;import er;public class UserDao {public User login(User loginUser) {//定义真实⽤户名密码(代替数据库读取)String trueUsername = "admin";String truePassword = "admin";if (loginUser.getUsername().equals(trueUsername) && loginUser.getPassword().equals(truePassword)) {//登陆成功return loginUser;} else {return null;}}关键来了,这也就是我们所讲的过滤器⽅法,这⾥所需要注意的就是登陆成功后,记得写⼊状态request.getSession().setAttribute("user",user);package cn.ideal.web.filter;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebFilter("/*")public class LoginFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;//获取资源请求路径String requestURI = request.getRequestURI();//排除包含登录确实所需要的资源,给予放⾏if (requestURI.contains("/login.jsp") || requestURI.contains("/loginServlet")) {chain.doFilter(request,response);}else{//不包含,即验证⽤户是否已经登录Object user = request.getSession().getAttribute("user");if (user != null){//登陆了,放⾏chain.doFilter(request,response);}else{//没有登录,跳转回登录页⾯request.getRequestDispatcher("/login.jsp").forward(request,response);}}}public void init(FilterConfig config) throws ServletException {}}(2) 敏感词过滤如果我们想要对⽤户提交的⼀些信息进⾏过滤,在servlet中进⾏⼀些代码的编写也算⼀种⽅法,但是最为合适的还是fiter,它更加通⽤,下⾯我们使⽤代理模式增强request从⽽使⽤filter进⾏敏感词的过滤我们就在刚才的index页⾯上加以修改<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>$Title$</title></head><body><h1>这是⾸页,只有登录后才能查看</h1><form action="/web-test/replaceServlet" method="post"><table><tr><td><input type="text" name="words"></td></tr><tr><td><input type="submit" value="敏感字检测"></td></tr></table></form></body></html>我们把传⼊的参数读取进来protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String words = request.getParameter("words");System.out.println(words);}package cn.ideal.web.filter;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.*;import ng.reflect.InvocationHandler;import ng.reflect.Method;import ng.reflect.Proxy;import java.util.ArrayList;import java.util.List;@WebFilter("/*")public class ReplaceFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//创建代理对象,增强getParameterServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() { @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//判断是不是getParameter⽅法if (method.getName().equals("getParameter")){//获取返回值String value = (String)method.invoke(req, args);if (value != null){for (String s : list){if (value.contains(s)){value = value.replaceAll(s,"***");}}}return value;}return method.invoke(req,args);}});chain.doFilter(proxy_req, resp);}private List<String> list = new ArrayList<String>();public void init(FilterConfig config) throws ServletException {try {//获取⽂件真实路径ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("/WEB-INF/classes/replace.txt");//读取⽂件BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"UTF-8"));//将每⼀⾏数据添加到list中String line = null;while((line = br.readLine())!=null){list.add(line);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}结尾:如果内容中有什么不⾜,或者错误的地⽅,欢迎⼤家给我留⾔提出意见, 蟹蟹⼤家!_如果能帮到你的话,那就来关注我吧!(系列⽂章均会在公众号第⼀时间更新)在这⾥的我们素不相识,却都在为了⾃⼰的梦⽽努⼒❤⼀个坚持推送原创Java技术的公众号:理想⼆旬不⽌。
java web 中过滤器的实现方法及过程
java web 中过滤器的实现方法及过程摘要:一、过滤器简介二、过滤器在Java Web中的应用三、过滤器实现方法1.创建过滤器类2.实现过滤器接口1.doFilter方法2.init和destroy方法3.注册过滤器四、过滤器实例分析1.登录拦截过滤器2.敏感词过滤器五、总结与展望正文:一、过滤器简介过滤器(Filter)是Java Web开发中的一种重要技术,它允许我们在请求处理之前或之后对请求进行处理,从而实现对请求的过滤和管理。
过滤器广泛应用于权限控制、日志记录、安全防护等方面。
二、过滤器在Java Web中的应用在Java Web项目中,过滤器通常部署在Web服务器(如Tomcat)中,并通过配置文件(如web.xml)进行管理。
当请求到达Web服务器时,过滤器可以根据配置对请求进行拦截和处理。
三、过滤器实现方法1.创建过滤器类要实现过滤器,首先需要创建一个过滤器类,该类需要继承`javax.servlet.Filter`接口。
2.实现过滤器接口接下来,需要实现过滤器接口中定义的方法。
主要有三个方法需要实现:1) doFilter方法:该方法在请求处理之前或之后被调用,可以根据需求对请求进行处理。
2) init方法:过滤器初始化时调用,用于初始化过滤器所需的资源、配置等。
3) destroy方法:过滤器销毁时调用,用于清理过滤器所占用的资源。
3.注册过滤器要将实现的过滤器应用到实际项目中,还需要在web.xml配置文件中注册过滤器。
注册过滤器的目的是让Web服务器在处理请求时能够找到并调用过滤器。
四、过滤器实例分析1.登录拦截过滤器登录拦截过滤器可以在用户登录时检查用户是否具备访问受保护资源的权限。
当请求到达受保护的资源时,过滤器会拦截请求,检查用户是否已登录且具备相应权限。
若未登录或权限不足,则重定向到登录页面。
2.敏感词过滤器敏感词过滤器可用于对用户输入的内容进行审查,过滤掉包含敏感词的言论。
javaweb中过滤器的实现方法及过程。
在Web开发过程中,过滤器是一种重要的组件,它可以拦截用户请求并对请求进行预处理或后处理。
在JavaWeb开发中,通过过滤器可以实现诸如登入验证、字符编码转换、请求日志记录等功能。
本文将介绍javaweb中过滤器的实现方法及过程。
二、过滤器的概念及作用过滤器是Servlet规范中的一种组件,它可以截获HTTP请求和响应,对它们进行过滤操作,然后将请求和响应传递给下一个过滤器链或目标资源。
过滤器的主要作用包括:1. 验证用户登入状态:通过过滤器可以实现登入验证功能,对未登入用户禁止访问某些资源;2. 数据过滤与校验:可以对请求参数进行过滤和校验,防止恶意攻击;3. 字符编码转换:通过过滤器可以统一对请求和响应的字符编码进行转换,保证数据的一致性;4. 请求日志记录:可以通过过滤器记录用户的请求信息,用于排查问题或优化系统。
三、过滤器的实现方法1. 实现Filter接口要实现一个过滤器,首先需要创建一个类并实现javax.servlet.Filter接口,该接口中有三个主要的方法需要实现,分别为:- init()方法:在过滤器被初始化时调用,可以在此方法中进行一些初- doFilter()方法:对请求进行过滤处理的核心方法,可以在此方法中对请求和响应进行操作;- destroy()方法:在过滤器被销毁时调用,可以在此方法中进行资源释放操作。
2. 配置过滤器在web.xml中配置过滤器,需要在<web-app>标签内添加<filter>和<filter-mapping>标签,分别用来配置过滤器和过滤器映射,示例配置如下:```xml<filter><filter-name>LoginFilter</filter-name><filter-class.example.filter.LoginFilter</filter-class></filter><filter-mapping><filter-name>LoginFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>```以上配置表示将名为LoginFilter的过滤器映射到所有的URL请求上。
java 过滤器的实现原理
Java 过滤器(Filter)是Java Web 应用程序中的一种重要组件,用于拦截请求和响应,并在它们到达或离开应用程序之前进行处理。
过滤器可以在多个阶段对请求和响应进行拦截,例如在客户端发送请求到服务器处理请求、服务器处理请求到返回响应、响应返回客户端之前等。
Java 过滤器的实现原理如下:1. 实现Filter 接口要实现一个过滤器,需要创建一个类并实现Filter 接口。
Filter 接口包含三个方法:* init(FilterConfig):用于初始化过滤器,此方法在过滤器创建时被调用,只会被调用一次。
在此方法中可以读取FilterConfig 对象中的参数,获取配置信息等。
* doFilter(ServletRequest, ServletResponse, FilterChain):此方法是过滤器的主要方法,用于拦截请求和响应。
当请求到达应用程序时,会被传递给doFilter 方法。
在此方法中,可以对请求和响应进行任何必要的处理,例如修改请求或响应的内容、记录日志等。
在处理完请求和响应后,需要将其传递给FilterChain,以便继续处理请求或返回响应。
* destroy(void):用于销毁过滤器,当过滤器不再需要使用时,此方法被调用。
在此方法中可以执行任何必要的清理操作,例如释放资源等。
2. 配置过滤器在web.xml 文件中,可以通过<filter> 元素定义一个过滤器,并指定过滤器的名称、类名和初始化参数等信息。
同时还需要指定过滤器在哪些URL 路径上生效,例如可以使用<filter-mapping> 元素将过滤器映射到指定的URL 路径上。
3. 应用过滤器当一个请求到达应用程序时,它会被传递给所有已经配置好的过滤器,并按相反的顺序执行:即先执行doFilter 方法,然后执行FilterChain 中的下一个组件(例如Servlet 或JSP),再返回响应给客户端。
javaweb中过滤器的实现方法及过程
一、概述在开发javaweb应用程序时,过滤器(Filter)是一个非常重要的组件。
过滤器能够拦截客户端发送的请求、服务端发送的响应,从而对它们进行处理和过滤。
本文将介绍javaweb中过滤器的实现方法及过程,以帮助读者更好地理解和应用过滤器。
二、过滤器的基本概念过滤器是一个实现了javax.servlet.Filter接口的类。
在javaweb应用程序中,过滤器可以拦截客户端发送的请求、服务端发送的响应,对它们进行处理和过滤。
过滤器通常用于对请求和响应进行统一的预处理和后处理,以便进行统一的日志记录、字符编码转换、权限检查等操作。
三、过滤器的实现方法过滤器的实现方法包括三个基本步骤:编写过滤器类、配置过滤器映射、部署过滤器。
1. 编写过滤器类为了实现一个过滤器,首先需要编写一个类,并让它实现javax.servlet.Filter接口。
通常情况下,过滤器类会包括三个主要方法:init()、doFilter()、destroy()。
其中,init()方法用于进行初始化操作,doFilter()方法用于实际的过滤处理,destroy()方法用于进行资源的释放。
```javapublic class MyFilter implements Filter {public void init(FilterConfig config) throws ServletException { // 初始化操作}public void doFilter(ServletRequest request, ServletResponse response, FilterCh本人n ch本人n) throws IOException, ServletException {// 进行过滤处理}public void destroy() {// 资源释放}}```2. 配置过滤器映射在web.xml文件中配置过滤器的映射关系,指定过滤器拦截的URL 模式和具体的过滤器类。
Java8过滤器(Filter)
Java8过滤器(Filter)1、在Java之前对List进⾏过滤的⽅式public class BeforeJava8 {public static void main(String[] args) {List<Person> peoples = Arrays.asList(new Person("java", 22),new Person("js", 35),new Person("css", 31));Person result = getStudentByName(peoples, "java");System.out.println(result);}private static Person getStudentByName(List<Person> peoples, String name) {Person result = null;for (Person person : peoples) {if (name.equals(person.getName())) {result = person;}}return result;}}2、在Java8使⽤Filter过滤Listpublic class FilterJava8 {public static void main(String[] args) {List<Person> peoples = Arrays.asList(new Person("java", 22),new Person("js", 35),new Person("css", 31));Person result1 = peoples.stream().filter(p -> "java".equals(p.getName())).findAny().orElse(null);System.out.println(result1);Person result2 = peoples.stream().filter(p -> "spring".equals(p.getName())).findAny().orElse(null);System.out.println(result2);Person result3 = peoples.stream().filter((p) -> "java".equals(p.getName()) && 22 == p.getAge()).findAny().orElse(null);System.out.println(result3);// 使⽤map收集String name = peoples.stream().filter(p -> "js".equals(p.getName())).map(Person::getName).findAny().orElse("");System.out.println(name);System.out.println("---------");List<String> names = peoples.stream().map(Person::getName).collect(Collectors.toList());names.forEach(System.out::println);}}。
Java中过滤器(Filter)和拦截器(Interceptor)的使用
Java中过滤器(Filter)和拦截器(Interceptor)的使⽤⽬录1.过滤器 (Filter)2.拦截器 (Interceptor)3.区别3.11、实现原理不同3.2 使⽤范围不同3.3 触发时机不同3.4 拦截的请求范围不同3.5 注⼊Bean情况不同3.6 控制执⾏顺序不同1.过滤器 (Filter)过滤器的配置⽐较简单,直接实现Filter 接⼝即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接⼝中定义了三个⽅法。
init() :该⽅法在容器启动初始化过滤器时被调⽤,它在 Filter 的整个⽣命周期只会被调⽤⼀次。
注意:这个⽅法必须执⾏成功,否则过滤器会不起作⽤。
doFilter() :容器中的每⼀次请求都会调⽤该⽅法, FilterChain ⽤来调⽤下⼀个过滤器 Filter。
destroy():当容器销毁过滤器实例时调⽤该⽅法,⼀般在⽅法中销毁或关闭资源,在过滤器 Filter 的整个⽣命周期也只会被调⽤⼀次@Componentpublic class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Filter 前置");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter 处理中");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.out.println("Filter 后置");}}2.拦截器 (Interceptor)拦截器它是链式调⽤,⼀个应⽤中可以同时存在多个拦截器Interceptor,⼀个请求也可以触发多个拦截器,⽽每个拦截器的调⽤会依据它的声明顺序依次执⾏。
java web中过滤器的实现方法过程
一、概述在Java web开发中,过滤器是一种非常重要的组件,用于对用户请求进行预处理、后处理以及过滤的操作。
通过过滤器,我们可以对用户请求进行统一的处理,包括验证用户的身份、对请求进行加密解密操作、对请求进行字符编码转换等。
本文将详细介绍Java web中过滤器的实现方法和过程。
二、过滤器的基本原理过滤器是基于Servlet规范的一种技术,它可以拦截用户请求和响应,并在请求和响应之间执行一些处理逻辑。
过滤器可以对请求进行预处理,也可以对响应进行后处理。
过滤器的基本原理是通过过滤器链来实现的,即可以定义多个过滤器,并按照指定的顺序依次执行。
每个过滤器都可以对请求和响应进行处理,并且可以决定是否继续传递给下一个过滤器或Servlet。
三、过滤器的实现方法1. 创建过滤器类在Java web项目中,我们需要创建一个类来实现过滤器。
这个类需要实现javax.servlet.Filter接口,并且实现接口中的doFilter()方法。
在doFilter()方法中,我们可以编写我们需要处理的逻辑代码,比如对请求进行验证、编码转换等操作。
2. 配置过滤器在web.xml文件中需要进行过滤器的配置,在<filter>标签中配置过滤器的名称和类名。
然后在<filter-mapping>标签中配置过滤器的名称和要过滤的URL模式。
这样就可以指定哪些请求需要经过过滤器进行处理。
3. 过滤器的生命周期过滤器在Web应用程序的启动时被加载,只会被初始化一次,并且在Web应用程序关闭时销毁。
在过滤器的初始化和销毁方法中,我们可以编写一些初始化和清理资源的逻辑。
4. 过滤器的执行顺序当一个请求到达时,会按照web.xml中<filter-mapping>的顺序依次执行匹配的过滤器。
如果一个请求匹配多个过滤器,那么它们的执行顺序就是web.xml中<filter-mapping>的顺序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
Java 过滤器的使用和拦截排除的实现
2016/08/11 0 Java 过滤器的使用和拦截排除的实现本文将对如下几个内容作出
讲解与说明:
web.xml 的简单介绍
filter 的工作原理
filter 的实现
拦截排除的实现和说明
web.xml 简单介绍在Java 开发中,我们每天都有跟拦截器打交道,但是很多人对
filter 到底是个什么东西可能并没有做深入的了解,包括对web.xml 中的servlet、
servlet-Mapping、filter、filter-mapping 都很陌生,那么现在我们可以简单的交流一
下。
servlet servlet servlet-name A /servlet-name servlet-class
com.test.TestServlet
/servlet-class /servlet servlet-mapping servlet-name A /servlet-name url-pattern /a.do /url-pattern /servlet-mapping servlet 上表达的意思就是声明一个名字A 的servlet,对应的实现类com.test.TestServlet。
servlet-mapping 表达的意思是,当一个
请求后缀为a.do 的http 请求发送过来以后,该请求会调用名字为A 的servlet,换句
话说就是执行TestServlet 来处理该请求。
filter 有了上面servlet 的理解,我们理解filter 就更加方便。
请看如下简单配
置。
filter filter-name SessionFilter /filter-name filter-class com.demo.test.util.SessionFilter /filter-class init-param param-name excludedPages
/param-name param-value /index.jsp /param-value !-- 匹配不做拦截的请求声明-- /init-param /filter filter-mapping !-- 拦截的请求类型-- filter-name SessionFilter
/filter-name url-pattern /index.jsp /url-pattern /filter-mapping 上面的filter 表达的意
思是声明一个名字叫做SessionFilter 的过滤器,该过滤器的具体实现对应
com.demo.test.util.SessionFilter。
该过滤器给定初始化参数(名称:excludedPages,
参数:excludedPages),类似httpServletRequest 对象中的声明的请求参数。
filter-。