- 浏览: 261136 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
1260533105:
uncaught invalidstateerror:Fail ...
WebSocket -
sh747665463:
压力好大啊
【转】如果你不知道接下去学什么,就看这个
package anni;
public class EncodingFilter implements Filter {
public void init(FilterConfig config) throws ServletException {}
public void destroy() {}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("gb2312");
chain.doFilter(request, response);
}
}
web.xml中
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>anni.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
filter标签部分定义使用的过滤器,filter-mapping标签告诉服务器把哪些请求交给过滤器处理。这里的/*表示所有请求,/表示根路径,*(星号)代表所有请求,加在一起就变成了根路径下的所有请求。这样,所有的请求都会先被EncodingFilter拦截,并在请求里设置上指定的gb2312编码。
================================
用filter控制用户访问权限
我们要保护的页面是admin/index.jsp,为此我们在web.xml进行如下配置。
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>anni.SecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
SecurityFilter过滤器:
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
if (session.getAttribute("username") != null) {
chain.doFilter(request, response);
} else {
res.sendRedirect("../failure.jsp");
}
}
首先要将ServletRequest和ServletResponse转换成HttpServletRequest和HttpServletResponse,因为Filter本来设计成为多种协议服务,http协议仅仅是其中一部分。不过我们接触到的也只有http,而且也只有转换成对应HttpServletRequest和HttpServletResponse才能进行下面的session操作和页面重定向。
得到了http请求之后,可以获得请求对应的session,判断session中的username变量是否为null,如果不为null,说明用户已经登录,就可以调用doFilter继续请求访问的资源。如果为null,说明用户还没有登录,禁止用户访问,并使用页面重定向跳转到failure.jsp页面显示提示信息。
==================================
filter所谓的特性
请求映射
filter-mapping和servlet-mapping都是将对应的filter或servlet映射到某个url-pattern上,当客户发起某一请求时,服务器先将此请求与web.xml中定义的所有url-pattern进行匹配,然后执行匹配通过的filter和servlet。
你可以使用三种方式定义url-pattern。
1.直接映射一个请求。
<servlet-mapping>
<servlet-name>ContactServlet</servlet-name>
<url-pattern>/contact.do</url-pattern>
</servlet-mapping>
2.映射一个路径下的所有请求。
<servlet-mapping>
<servlet-name>EncodingFilter</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
3.映射结尾相同的一类请求。
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
想要获得所有以user开头.do结尾的请求吗?user*.do在url-pattern是无法识别的,只能配置成*.do,再去servlet中对请求进行筛选。
想要让一个servlet负责多个请求吗?/user/*,/admin/*,*.do写在一起url-pattern也不认识,只能配成多个servlet-mapping。
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/admin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
过滤链
服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。执行的顺序就如上图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。
过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之前,这样才能确保在使用请求中的数据前设置正确的编码。
filter的详细配置
在servlet-2.3中,Filter会过滤一切请求,包括服务器内部使用forward转发请求和<%@ include file="/index.jsp"%>的情况。
到了servlet-2.4中Filter默认下只拦截外部提交的请求,forward和include这些内部转发都不会被过滤,但是有时候我们需要forward的时候也用到Filter,这样就需要如下配置。
<filter>
<filter-name>TestFilter</filtername>
<filter-class>anni.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filtername>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>EXCEPTION</dispatcher>
</filter-mapping>
这样TestFilter就会过滤所有状态下的请求。如果我们没有进行设置,默认使用的就是REQUEST。而EXCEPTION是在isErrorPage="true"的情况下出现的,这个用处不多,看一下即可。
这里FORWARD是解决request.getDispatcher("index.jsp").forward(request, response);无法触发Filter的关键,配置上这个以后再进行forward的时候就可以触发过滤器了。
Filter还有一个有趣的用法,在filter-mapping中我们可以直接指定servlet-mapping,让过滤器只处理一个定义在web.xml中的servlet。
<filter-mapping>
<filter-name>TestFilter</filter-name>
<servlet-name>TestServlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>anni.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
直接指定servlet-name,TestFilter便会引用TestServlet配置的url-pattern,在某些filter与servlet绑定的情况下不失为一个好办法。
发表评论
-
jvm回顾
2018-11-29 09:10 0一、运行时数据区域 1、程序计数器(program co ... -
转一篇泛型介绍不错的文章
2018-08-02 19:10 610泛型,一个孤独的守门者。 大家可能会有疑问,我为什么叫做泛 ... -
jstat
2018-02-04 11:36 400jps(Java Virtual Machine Proce ... -
转:ant 入门
2017-12-09 17:58 5871)什么是Ant ant是构建工具 2)什么是构 ... -
廉颇老矣?n年没写ant,发现生疏了,这不是我想要的
2017-12-09 11:37 536毕业10年,差不多6年没有碰ant了,昨天解决一个siga ... -
jdk 9 hellomodules
2017-10-03 20:45 4451、准备 lib mods src/cn.gbase ... -
转:Java 9,OSGi以及模块化的未来
2017-10-03 19:19 0ava 9,OSGi以及模块化的 ... -
转:Java 9,OSGi以及模块化的未来
2017-10-03 19:12 0<div class="iteye-blog- ... -
转:Java 8 中的 Streams API 详解
2017-10-02 21:39 399Java 8 中的 Streams API 详 ... -
转:装饰模式
2017-01-01 10:46 474一个有意思的装饰模式样例。 Java与模式:装饰(D ... -
转:Java中多态性的实现
2016-08-25 11:10 508Java中多态性的实现 什么是多态 面向对象的三大 ... -
深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
2016-01-22 14:35 2629作者:Lucida 微博:@peng_gong 豆瓣 ... -
转:permGen space out of memory
2013-11-21 12:53 998PermGen space的全称是Permanent Gen ... -
trove high performance collections for java
2013-06-02 10:31 671trove high performance collec ... -
kettle Could not find the main class. Program will exit err
2013-06-01 15:44 0I am new in KETTLE. I am tryi ... -
jvm参数集合
2013-05-26 15:42 659一、内存分配 -xms java heap初始化时的大小 ... -
jvm优化配置
2013-05-26 15:16 892server 和 client两种模 ... -
http 错误代码
2013-04-25 09:00 651HTTP 400 – 请求无效HTTP 401.1 – 未授 ... -
JDBC 规范4.1 翻译 (一)
2012-12-28 14:41 23从今天开始希望每天抽出来一点时间把JDBC规范4. ... -
jconsole配置远程监控
2012-11-29 16:59 1598java -Djava.rmi.server. ...
相关推荐
Web.xml 中的 listener、filter、servlet 加载顺序及其详解 在 Web 应用程序中,web.xml 文件扮演着非常重要的角色,它定义了 Web 应用的结构和配置。其中,listener、filter、servlet 是三个非常重要的概念,它们...
1. **配置顺序**:在 web.xml 中,Filter 的配置顺序决定了它们的执行顺序。可以通过调整 `<filter-mapping>` 元素的位置来调整 Filter 的优先级。 2. **多个 Filter**:一个请求可以经过多个 Filter,每个 Filter ...
过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程的文章内的示例代码,文章...通过文章和这份代码,你可以学到过滤器、拦截器、AOP、ControllerAdvcie的基本使用方式,并了解到他们的执行顺序。
你可以通过调整这些标签的位置来控制过滤器的执行顺序。 3. **Servlet(服务程序)** Servlet是实现了`javax.servlet.Servlet`或其子接口的类,它们负责处理HTTP请求和生成响应。在`web.xml`中,Servlet通过`...
5. 执行顺序:拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。 FilterDispatcher 的四个功能 1. 执行 Actions:FilterDispatcher 通过 ActionMapper 对象来判断是否应该被映射到 Action。 2. 清除 ...
- **Filter链**:多个Filter可以串联,形成一个链,请求会按顺序通过每个Filter。 - **Filter参数**:在`web.xml`中可以通过`init-param`为Filter提供配置参数,以便在Filter中使用。 - **异步Filter**:Java ...
7. **Filter的执行顺序**:在`web.xml`中,Filter的配置顺序决定了它们的执行顺序。如果多个Filter映射到同一个URL,那么在`<filter-mapping>`标签内的顺序决定了Filter的执行顺序,先声明的先执行。 通过以上知识...
Java Web项目启动执行顺序详解 Java Web项目启动执行顺序是指在 Java Web 项目中,从服务器启动到项目启动的整个过程。该过程涉及到多个配置节点、监听器、过滤器、Servlet 等组件的协作执行。下面将对 Java Web ...
- 配置Filter的顺序很重要,先调用的Filter先执行,考虑清楚每个Filter的作用域。 总结,Java Filter在Java Web开发中起着关键作用,它提供了一种灵活的方式,用于在请求和响应之间插入自定义逻辑,解决了诸如字符...
过滤链决定了Filter的执行顺序,按照`web.xml`中定义的顺序执行。当有多个Filter同时处理一个请求时,服务器会根据配置的顺序依次调用`doFilter()`方法。如果需要改变这个顺序,只需调整`web.xml`中Filter的声明顺序...
赵劼老师的课程中可能涵盖了如何创建自定义过滤器、如何应用过滤器到控制器或操作上、以及如何配置过滤器的顺序和优先级。此外,他还可能讲解了过滤器上下文对象,如`FilterContext`,它提供了关于当前请求和过滤器...
多个Filter可以形成一个链,按照声明的顺序依次执行。 - `@WebFilter`注解也可以用于Java EE 6及更高版本的Filter配置,提供更灵活的编程式配置。 4. **Filter的典型应用场景** - **安全控制**:使用Filter检查...
Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。 Filter 接口中有三个重要的方法:init()、doFilter() 和 destroy()。 init() 方法是在 web 应用程序启动时,web 服务器将根据 ...
请求会按配置的顺序逐个通过Filter,最后到达Servlet。响应则逆序返回,先经过最后一个Filter,再依次返回。 4. **使用Filter**: 配置Filter通常在`web.xml`文件中完成,包括定义Filter类、设置过滤规则(如URL...
- Filter的执行顺序取决于它们在web.xml中的配置顺序。每个Filter的doFilter()方法会被调用,直到请求达到Servlet,或者在Filter中中断过滤链。 4. **Filter接口** - **init()**:在Filter实例化后,Web容器会...
6. **Filter执行**: 当接收到请求时,Tomcat会创建一个`FilterChain`,并把Filter和对应的Servlet加入到链中。每个请求都会创建一个新的`FilterChain`,然后按照配置顺序调用`doFilter`方法。 7. **销毁**: 服务器...
本文将详细介绍web.xml中的Servlet、Bean、Filter、Listener加载顺序,并探讨其内部执行顺序。 首先,我们需要了解web.xml文件的基本结构。web.xml文件主要包含了四个部分:Servlet、Bean、Filter、Listener。其中...
若同时配置了多个Filter,它们的执行顺序由`@WebFilter`注解中的`dispatcherTypes`或`<filter-mapping>`的`dispatcher`元素决定。默认情况下,Filter按配置顺序执行,但可以通过`@Order`注解或`web.xml`中`filter-...
过滤器的执行顺序由它们的顺序决定,从上到下依次执行。如果两个过滤器同时应用于一个动作,将按照它们在代码中的排列顺序执行。 **5. 过滤器的生命周期和范围** 过滤器可以在全局、控制器级别或单独的动作级别应用...