java关于ServletConfig FilterConfig什么用
FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。
FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参数。
如何配置Filter过滤器处理JSP中文乱码
Filter类:
public class EncodingFilter implements Filter {
private String charset = "UTF-8";
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
if(req.getMethod().equalsIgnoreCase("GET")) {
if(!(req instanceof GetRequest)) {
req = new GetRequest(req, charset);
}
} else {
req.setCharacterEncoding(charset);
}
chain.doFilter(req, response);
}
@Override
public void init(FilterConfig fConfig) throws ServletException {
String charset = fConfig.getInitParameter("charset");
if(charset != null && !charset.isEmpty()) {
this.charset = charset;
}
}
}
public class GetRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
private String charset;
public GetRequest(HttpServletRequest request, String charset) {
super(request);
this.request = request;
this.charset = charset;
}
@Override
public String getParameter(String name) {
String value = request.getParameter(name);
if(value == null) return null;
try {
return new String(value.getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Map getParameterMap() {
Map<String,String[]> map = request.getParameterMap();
if(map == null) return map;
for(String key : map.keySet()) {
String[] values = map.get(key);
for(int i = 0; i < values.length; i++) {
try {
values[i] = new String(values[i].getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
return map;
}
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
for(int i = 0; i < values.length; i++) {
try {
values[i] = new String(values[i].getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
return values;
}
}
web.xml配置:
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>此处填写包名.类名</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
servlet filter 控制页面访问
你可以配置某些页面不做过滤嘛,增加ignoreURL参数,在里面加上你无需过滤的页面(登录页面)
loginCheck
*.LoginFilter
ignoreURL
/login.do,/logon.jsp
然后在过滤器里面这样处理:
public class LoginFilter implements Filter{
protected FilterConfig ftConfig;
protected String ignoreURL = null;
protected ArrayList alIgnoreURL = new ArrayList();
public void init(FilterConfig filterConfig) throws ServletException {
// TODO 自动生成方法存根
this.ftConfig=filterConfig;
this.ignoreURL = ftConfig.getInitParameter("ignoreURL");
StringTokenizer tokenizer = new StringTokenizer(ignoreURL, ",");
while (tokenizer.hasMoreElements()) {
alIgnoreURL.add(tokenizer.nextElement().toString());
}
}
doFilter方法:
String requestUrl=httpRequest.getRequestURI();
if (!isIgnoreURL(requestUrl, httpRequest.getContextPath() + java.io.File.pathSeparator))才做过滤
isIgnoreURL方法:
public boolean isIgnoreURL(String url, String contextPath) {
for (int i = 0; i < this.alIgnoreURL.size(); i++) {
if (url.indexOf((String) this.alIgnoreURL.get(i)) != -1) {
return true;
}
if (url.equals(contextPath + "/")) {
return true;
}
}
return false;
}
就算你都是用iframe来显示页面,但总有提交到页面的请求吧,把例外的请求加入到ignoreURL中就可以,不管是jsp或了html或.do都可以加进去。
顺便说一句,我现在的系统实现跟你说的一样,都是用iframe加frameset来显示页面的
怎么配置servlet filter
Filter开发分为二个步骤:
1.编写java类实现Filter接口,并实现其doFilter方法。
2.在 web.xml 文件中使用
和元素对编写的filter类进行注册,并设置它所能拦截的资源。
Filter链
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。
在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
Filter链实验(查看filterChain API文档)
Filter的部署-注册Filter
testFitler
<.test.TestFiter
word_file
/WEB-INF/word.txt
1.用于为过滤器指定一个名字,该元素的内容不能为空。
2.元素用于指定过滤器的完整的限定类名。
3.元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
元素用于设置一个 Filter 所负责拦截的资源。
一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
子元素用于设置filter的注册名称。
该值必须是在元素中声明过的过滤器的名字
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
指定过滤器所拦截的Servlet名称。
指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。
用户可以设置多个 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
子元素可以设置的值及其意义:
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。
如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。
除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。
除此之外,过滤器不会被调用。
Tip:Filter的部署—映射Filter示例:
testFilter
/test.jsp
testFilter
/index.jsp
REQUEST
FORWARD
FilterConfig接口:
用户在配置filter时,可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。
因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。
如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
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一样,具体代码
NoCacheFilter
<.xingyun.servlet.filter.NoCacheFilter
NoCacheFilter
/*
至此,就实现了一个简单的用于禁用浏览器缓存的过滤器了。
上面说了这么多,在开发中哪些地方中能用到Filter才是最终目的,好了,我大概说一下我在开发中用到的地方。
①.上面提到的禁用浏览器的缓存。
这个真的很重要,有时候修改了前端页面,就是因为缓存的原因,导致页面不 能及时刷新过来,真的很蛋疼。
②.解决中文乱码的问题。
在开发中,页面可能达到几十个甚至上百个,在每个页面处理中文乱码的问题很烦,但 是通过过滤器,那么问题就变得很简单了。
③.通过检查用户是否登录来管理用户是否可以访问某些页面,比如个人隐私等页面。
这个用的也是蛮多的。