Ⅰ servlet中filter有什么用
首先介绍一下Filter到底是个什么东西:
根据这个单词就能猜到Filter的中文意思是过滤器,事实当然也是这样的;Filter是Servlet中的一个重 要组件。
接下来简单说说Filter这个接口中的常用方法吧。
①.init():类似于Servlet生命周期中的init()方法,用于初始化一些关于Filter接口的参数;只在Servlet 启动时调用一次。
②.doFilter():类似于Servlete生命周期中的service()方法,该方法用于存放逻辑代码。
③.destory():同理类似于Servlet生命周期中的destroy()方法,当Servlet容器销毁前调用该方法。
然后说说如何创建一个Filter的HelloWorld。
①.创一个抽象的Java类,该类实现了Filter接口,同时实现了Filter接口的部分方法,例如
init(),destroy()方法。具体实现代码如下:
public abstract class HttpFilter implements Filter {
private HttpServletRequest request;
private HttpServletResponse response;
//重写Filter接口的destory方法
public void destroy() {}
//重写doFilter方法,这个方法在这里主要作用是将ServletRequest,ServletResponse对象转为对 //应的HttpServletRequest,HttpServletResponse对象
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
this.request = (HttpServletRequest) arg0;
this.response = (HttpServletResponse) arg1;
doFilter(request, response, arg2);
}
//该方法交由继承该抽象类的实现类来实现
public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,
FilterChain chain);
private FilterConfig config;
//这个方法是为了方便子类获取ServletContext对象
public FilterConfig getFilterConfig(){
return config;
}
//该方法一般不建议重写,因为重写该方法会出现某些错,基于此提供了下面的无参数的init()方法
public void init(FilterConfig arg0) throws ServletException {
this.config = arg0;
init();
}
public void init(){}
}
②.一个继承了HttpFilter抽象类的实现类,代码如下,只要功能是为了实现禁用浏览器缓存
public class NoCacheFilter extends HttpFilter{
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) {
//通过过滤器实现页面禁用浏览器缓存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
}
}
③.将该实现类配置到web.xml文件中,配置方式和配置普通的Servlet一样,具体代码
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.xingyun.servlet.filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
至此,就实现了一个简单的用于禁用浏览器缓存的过滤器了。
上面说了这么多,在开发中哪些地方中能用到Filter才是最终目的,好了,我大概说一下我在开发中用到的地方。
①.上面提到的禁用浏览器的缓存。这个真的很重要,有时候修改了前端页面,就是因为缓存的原因,导致页面不 能及时刷新过来,真的很蛋疼。
②.解决中文乱码的问题。在开发中,页面可能达到几十个甚至上百个,在每个页面处理中文乱码的问题很烦,但 是通过过滤器,那么问题就变得很简单了。
③.通过检查用户是否登录来管理用户是否可以访问某些页面,比如个人隐私等页面。这个用的也是蛮多的。
Ⅱ Elasticsearch的缓存机制简介
根据名称其实就能理解,这是属于Node级别的缓存。主要用于缓存Filter中的Query结果,基于LRU策略,当缓存满了的情况下,会自动去除一个最近最少被使用的Query Cache。
缓存分为两个级别,第一级是 Query ,第二级是 Segmemt ,就像是 Map<Query, Map<Segment, DocIdSet>> 这种结构一样。 DocIdSet 使用的数据结构是 Bitset 。
indices.queries.cache.size 集群中的每个节点都必须有的静态配置,用来控制用来缓存的内存大小,默认是10%,支持两种格式一种是百分数,代表占节点heap的百分比,另一种则是精确的值,比如512mb。
indices.queries.cache.count 在官方文档并没有写,这是一个节点级别的配置,可以在elasticsearch.yml中配置,控制缓存的总数量。
indices.queries.cache.all_segments 用于是否在所有 Segment 上启用缓存,默认是false,不会对文档数小于100000或者小于整个索引大小的3%的 Segment 进行缓存。
index.queries.cache.enabled 是属于index级别的配置,用来控制是否启用缓存,默认是开启的。
Segment 中文档数大于100000或者大于整个所以大小的3%。
请注意如果想要索引所有段,请设置indices.queries.cache.all_segments
缓存不会失效,而是通过判断文档是否符合 Query 的条件,如果符合条件的话则会将文档加入到 Bitset 中。
主要用于 sort 以及 aggs 的字段。这会把字段的值加载到内存中,以便于快速访问。 field data cache 的构建非常昂贵,因此最好能分配足够的内存以保障它能长时间处于被加载的状态。
indices.fielddata.cache.size 用来控制缓存的大小,支持两种格式,一种是百分数,代表占节点heap的百分比,另一种是精确值,如10gb,默认是无限。
顾名思义,Shard级别的缓存。默认的主要用于缓存size=0的请求, aggs 和 suggestions ,还有就是 hits.total 。
需要注意,每当分片索引refresh的时候,如果数据发生了实际变化,那么缓存就会自动失效。所以呢,refresh时间越长,那么缓存的时间也就越长。缓存采用的也是LRU策略。
index.requests.cache.enable 这个参数用来控制是否启用分片级别的缓存,默认是false
通过url传参方式request_cache=true
indices.requests.cache.size 用来控制缓存在 heap 中的大小,默认是1%。
用于缓存新索引的数据,用于缓存新索引的数据,当空间填满之后,会将数据写到磁盘上成为一个新的段。