Spring 配置 工程Web.xml中encodingFilter
来源:互联网 发布:linux dd bs 编辑:程序博客网 时间:2024/04/30 07:35
在web.xml中的配置如下
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter>
上面的代码片显示Spring中的管理类是CharacterEncodingFilter下面我们进入到这个类的内部,首先看下继承关系
public class CharacterEncodingFilter extends OncePerRequestFilter public abstract class OncePerRequestFilter extends GenericFilterBeanpublic abstract class GenericFilterBean implements Filter, BeanNameAware, EnvironmentAware, ServletContextAware, InitializingBean, DisposableBean
最终继承的类是**javax.servlet.Filter**,这个类初始化调用的是`public final void init(FilterConfig filterConfig)函数, `参数filterConfig是工程启动的时候传递的。当请求产生的时候调用类的`public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)`方法。这个方法是在**OncePerRequestFilter**类中重写的,
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) { throw new ServletException("OncePerRequestFilter just supports HTTP requests"); } HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName(); if (request.getAttribute(alreadyFilteredAttributeName) != null || shouldNotFilter(httpRequest)) { // Proceed without invoking this filter... filterChain.doFilter(request, response); } else { // Do invoke this filter... request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE); try { doFilterInternal(httpRequest, httpResponse, filterChain); } finally { // Remove the "already filtered" request attribute for this request. request.removeAttribute(alreadyFilteredAttributeName); } } }
首先看到doFilterInternal方法,这个是用户直接交互的类中需要实现的抽象方法,也就是可以在这里定义自己想要的行为。具体到代码实在CharacterEncodingFilter中
protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) { request.setCharacterEncoding(this.encoding); if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); }
代码写的很清楚,只是根据配置参数信息将request和response设置相应的编码格式。
这里在重点说一下FilterChain这个类,俗名过滤链,这个类的作用就是对当前的请求执行一系列的过滤操作,是一个接口,这里直接说实现类VirtualFilterChain这个类是作为class CompositeFilter implements Filter
的私有内部类实现的。类的里面是以List<? extends Filter>
的数据结构模拟链的顺序执行。上代码:
private static class VirtualFilterChain implements FilterChain { private final FilterChain originalChain; private final List<? extends Filter> additionalFilters; private int currentPosition = 0; private VirtualFilterChain(FilterChain chain, List<? extends Filter> additionalFilters) { this.originalChain = chain; this.additionalFilters = additionalFilters; } public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { if (currentPosition == additionalFilters.size()) { originalChain.doFilter(request, response); } else { currentPosition++; Filter nextFilter = additionalFilters.get(currentPosition - 1); nextFilter.doFilter(request, response, this); } } }
0 0
- Spring 配置 工程Web.xml中encodingFilter
- web.xml文件中的encodingFilter编码配置
- web.xml中配置spring
- web.xml中配置Spring
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- JavaWeb工程中web.xml基本配置
- Struts2的值栈
- 3.24
- 第十六周oj刷题——Problem E: B 构造函数和析构函数
- hibernate查询之Criteria实现分页方法(GROOVY语法)
- #define 的高级用法
- Spring 配置 工程Web.xml中encodingFilter
- 网页抓取神器scrapy的安装搭建
- Android Studio生成数字签名
- jvm垃圾回收
- Android OpenGL ES(七)----理解纹理与纹理过滤
- 爸爸和儿子的对话!佩服!值得存五十年!
- C++IO对象不可复制或赋值
- 模板方法
- Java设计模式之工厂方法模式