1. java过滤器的1、request过滤器
这种过滤器的工作方式比较简单,大家也经常遇到,如下图所示:
以下是web.xml文件配置方式:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>xx.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目标资源一</servlet-name>
</filter-mapping>
下面我们更改一下web.xml文件的配置,如下方式:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>xx.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目标资源一</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目标资源二</servlet-name>
</filter-mapping>
也就是说此过滤器对目标资源一和目标资源二都进行过滤,然后当目标资源一被访问的时候我们将请求转发给目标资源二,那么这个时候过滤器是怎么工作的呢?如下图所示:
我们可以看到,当我们访问目标资源一时过滤器截取了请求,然后再转发给目标资源一,然后再转发给目标资源二,从图中我们可以看到过滤器没有截取转发到目标资源二的请求,但是我们已经在web.xml文件中配置了该过滤器对目标资源二的过滤,为什么又没有起到过滤作用呢?
答案就在于,目标资源一是客户端直接访问,而目标资源二是被转发过来的,这时过滤器就不能过滤目标资源二。如果你直接访问目标资源二,你会发现该过滤器起到了作用?
我们上面的web.xml文件配置与以下方式等价:
<filter>myFilter</filter>
<filter-name>myFilter</filter-name>
<filter-class>xx.MyFilter</filte-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目标资源一</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目标资源二</servlet-name>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
这种方式的配置,说明只有直接访问该目标资源时该过滤器才会起作用,对转发到该目标资源的请求将忽略不处理。
那如果我想对转发到目标资源二的请求进行过滤,那怎么办呢?答案见,下一种过滤器,forward过滤器。
2. java web 过滤器跟拦截器的区别和使用
区别如下:
1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3 、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4 、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5 、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
使用如下:
在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。
这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。
(2)java过滤器不起作用扩展阅读:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。
3. java过滤器的3、include过滤器
理解了forward过滤器之后,include过滤器就不难理解了。以下方式:
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目标资源二</servlet-name>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
此表示对包含了目标资源二的请求过滤,如果直接访问目标资源二,则此过滤器将不起作用。
include包含以下语句:
在JSP页面中的动作:<jsp:include page=.......
在Java代码中的request.getRequestDispatcher(....).include
注意:如果目标资源一通过<%@ include file=目标资源二%>指令包含,这时此过滤器不工作。
4. java 文件过滤器为什么报空指针异常求详解!!!
accept函数你用的不对,它只需要你指定过滤条件就可以了,不需要递归调用.
如果你需要其子目录下的.png文件,可以另外写一个递归调用.
完整的文件过滤的Java程序如下
importjava.io.File;
importjava.io.FilenameFilter;
{
@Override
publicbooleanaccept(Filedir,Stringname){
if(name.toLowerCase().endsWith(".png"))returntrue;
returnfalse;
}
}
publicclassFileDemo6_1{
staticvoidfindFile(Filedir){
if(dir.isDirectory()){
File[]fs1=dir.listFiles(newMyFilenameFilter1());
for(Filefile2:fs1){
System.out.println(file2);
}
File[]fs=dir.listFiles();
for(Filefile:fs){
findFile(file);
}
}
}
publicstaticvoidmain(String[]args){
findFile(newFile("C:/tmp/6"));
}
}
运行结果
C: mp6female.png
C: mp6male.png
C: mp6imagefemale.png
5. java web项目中过滤器的使用(过滤器执行多次)
图片中显示的log是执行一次的。
不是本来就打开login.jsp吗,不用再跳转到login.jsp,不是的时候,再跳转。
6. javaee怎样使filter不生效
过滤器配置正确,但却没有起到过滤作用,原因可能是排放位置的问题。如下: 错误: struts2 com.yiwo.base.web.filter.PrepareFilter userFilter com.yiwo.base.web.filter.UserFilter
7. 编写个过滤器不起作用
index.jsp页面与filter.jsp页面是不是放在项目的根目录下了?如果不是的话,过滤器不起作用
8. java web项目里面的加了过滤器,在自己电脑上面测试项目的时候就打不开网页了,怎么回事
这是我自己写过的一个登陆过滤器
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
System.out.println("=============LoginFilter============");
//将父类转成子类
HttpServletRequest request=(HttpServletRequest) req;
//javaweb_T7/LoginServlet
String uri=request.getRequestURI();
//控制登录的
HttpSession session=request.getSession();
String userName=(String) session.getAttribute("userName");
//如果没有登录就跳转
//要么你session中有东西(已经登录) ,要么你是登录的动作
if(userName!=null || uri.indexOf("LoginServlet")!=-1){
//如果登录过,就不阻拦
chain.doFilter(req, res);
}else{
request.setAttribute("msg", "请先登录后操作");
request.getRequestDispatcher("login.jsp")
.forward(request, res);
}
}
9. java过滤器 response不好用,高手给看看!!!
建议把java代码中的汉字用utf-8编码后返回
在页面有utf-8再解码
10. 为何java中的过滤器filter不起作用
过滤器配置正抄确,但却没有起到过滤作用,原因可能是排放位置的问题。如下:
错误:
<filter>
<filter-name>struts2</filter-name>
<filter-class>com.yiwo.base.web.filter.PrepareFilter</filter-class>
</filter>
<filter>
<filter-name>userFilter</filter-name>
<filter-class>com.yiwo.base.web.filter.UserFilter</filter-class>
</filter>