编写servlet过滤器时下面哪个接口用于调用过滤器连接
发布网友
发布时间:2022-04-28 17:33
我来回答
共1个回答
热心网友
时间:2022-06-21 01:00
Filter简介
Filter称滤器Servlet技术实用技术Web发员通Filter技术web服务器管理所web资源:例Jsp,
Servlet, 静态图片文件或静态 html
文件等进行拦截实现些特殊功能例实现URL级别权限访问控制、滤敏词汇、压缩响应信息等些高级功能
主要用于用户请求进行预处理HttpServletResponse进行处理使用Filter完整流程:Filter用户请求进行预处理接着请求交给Servlet进行处理并响应Filter再服务器响应进行处理
Filter功能
HttpServletRequest达 Servlet 前拦截客户HttpServletRequest 根据需要检查HttpServletRequest修改HttpServletRequest 数据
HttpServletResponse达客户端前拦截HttpServletResponse 根据需要检查HttpServletResponse修改HttpServletResponse数据
何借助Filter实现拦截功能
Filter接口doFilter发员编写Filter并配置哪web资源进行拦截Web服务器每调用web资源service前都先调用filterdoFilter该内编写代码达目:
调用目标资源前让段代码执行
否调用目标资源(即否让用户访问web资源)
web服务器调用doFilter传递filterChain象进filterChain象filter接口重要象提供doFilter发员根据需求决定否调用调用该则web服务器调用web资源service即web资源访问否则web资源访问
Filter发两步走
编写java类实现Filter接口并实现其doFilter
web.xml文件编写filter类进行注册并设置所能拦截资源
web.xml配置各节点介绍:
指定滤器
用于滤器指定名字该元素内容能空
元素用于指定滤器完整限定类名
元素用于滤器指定初始化参数元素指定参数名字指定参数值
滤器使用FilterConfig接口象访问初始化参数
元素用于设置 Filter 所负责拦截资源Filter拦截资源通两种式指定:Servlet 名称资源访问请求路径
元素用于设置filter注册名称该值必须元素声明滤器名字
设置 filter 所拦截请求路径(滤器关联URL式)
指定滤器所拦截Servlet名称
指定滤器所拦截资源 Servlet 容器调用式REQUEST,INCLUDE,FORWARDERROR默认REQUEST用户设置元素用指定 Filter 资源种调用式进行拦截
元素设置值及其意义
REQUEST:用户直接访问页面Web容器调用滤器目标资源通RequestDispatcherinclude()或forward()访问该滤器调用
INCLUDE:目标资源通RequestDispatcherinclude()访问该滤器调用除外该滤器调用
FORWARD:目标资源通RequestDispatcherforward()访问该滤器调用除外该滤器调用
ERROR:目标资源通声明式异处理机制调用该滤器调用除外滤器调用
Filter链
web应用发编写Filter些Filter组合起称Filter链
web服务器根据Filterweb.xml文件注册顺序决定先调用哪Filter第FilterdoFilter调用web服务器创建代表Filter链FilterChain象传递给该doFilter发员调用FilterChain象doFilter则web服务器检查FilterChain象否filter则调用第2filter没则调用目标资源
Filter命周期
public void init(FilterConfig filterConfig) throws ServletException;//初始化
我编写Servlet程序Filter创建销毁由WEB服务器负责 web 应用程序启web 服务器创建Filter 实例象并调用其init读取web.xml配置完象初始化功能续用户请求作拦截准备工作(filter象创建init执行)发员通init参数获代表前filter配置信息FilterConfig象
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//拦截请求
完实际滤操作客户请求访问与滤器关联URL候Servlet滤器先执行doFilterFilterChain参数用于访问续滤器
public void destroy();//销毁
Filter象创建驻留内存web应用移除或服务器停止才销毁Web容器卸载 Filter 象前调用该Filter命周期仅执行释放滤器使用资源
FilterConfig接口
用户配置filter使用filter配置些初始化参数web容器实例化Filter象调用其init封装filter初始化参数filterConfig象传递进发员编写filter通filterConfig象获内容:
String getFilterName();//filter名称
String getInitParameter(String name);//返部署描述指定名称初始化参数值存返null.
Enumeration getInitParameterNames();//返滤器所初始化参数名字枚举集合
public ServletContext getServletContext();//返Servlet文象引用
Filter使用案例
使用Filter验证用户登录安全控制
前段间参与维护项目用户退系统再址栏访问历史根据url仍能够进入系统响应页面我检查发现请求未进行滤验证用户登录添加filter搞定问题
先web.xml配置
SessionFilter
com.action.login.SessionFilter
logonStrings
/project/index.jsp;login.do
includeStrings
.do;.jsp
redirectPath
/index.jsp
disabletestfilter
N
SessionFilter
/*
接着编写FilterServlet
package com.action.login;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* 判断用户否登录,未登录则退系统
*/
public class SessionFilter implements Filter {
public FilterConfig config;
public void destroy() {
this.config = null;
}
public static boolean isContains(String container, String[] regx) {
boolean result = false;
for (int i = 0; i < regx.length; i++) {
if (container.indexOf(regx[i]) != -1) {
return true;
}
}
return result;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest hrequest = (HttpServletRequest)request;
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
String logonStrings = config.getInitParameter("logonStrings"); // 登录登陆页面
String includeStrings = config.getInitParameter("includeStrings"); // 滤资源缀参数
String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// 没登陆转向页面
String disabletestfilter = config.getInitParameter("disabletestfilter");// 滤器否效
if (disabletestfilter.toUpperCase().equals("Y")) { // 滤效
chain.doFilter(request, response);
return;
}
String[] logonList = logonStrings.split(";");
String[] includeList = includeStrings.split(";");
if (!this.isContains(hrequest.getRequestURI(), includeList)) {// 指定滤参数缀进行滤
chain.doFilter(request, response);
return;
}
if (this.isContains(hrequest.getRequestURI(), logonList)) {// 登录页面进行滤
chain.doFilter(request, response);
return;
}
String user = ( String ) hrequest.getSession().getAttribute("useronly");//判断用户否登录
if (user == null) {
wrapper.sendRedirect(redirectPath);
return;
}else {
chain.doFilter(request, response);
return;
}
}
public void init(FilterConfig filterConfig) throws ServletException {
config = filterConfig;
}
}
既完用户所请求均要经Filter进行验证用户登录
防止文乱码滤器
项目使用spring框架前台JSP页面Java代码使用同字符集进行编码候现表单提交数据或者传/载文名称文件现乱码问题使用滤器
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
false
encoding
/*
-