Filter是在访问网页或者servlet中进行先一步处理的机制
0.在eclipse中建立的filter后,在web.xml文件中已经添加了相应的配置信息,可以进行修改
多个filter构成filter链,按照顺序进行过滤
<filter>
<filter-name>Autologin</filter-name>
<filter-class>lne.Autologin</filter-class>
<!-- 过滤器的具体路径 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!-- 设定初始化参数 -->
</filter>
<filter-mapping>
<filter-name>Autologin</filter-name>
<url-pattern>/*</url-pattern>
<!-- 配置需要过滤的路径,*为通配符 -->
<dispatcher>FORWARD</dispatcher>
<!-- 设定拦截类型
REQUEST 通过RequestDispatcher的include()和forward()访问的则不会被调用
INCLUDE 过滤RequestDispatcher的include()
FORWARD 过滤RequestDispatcher的forward()
ERROR 通过异常处理机制调用
-->
</filter-mapping>
<!-- 如果有多个filter过滤相同的url,则按照在web.xml顺序进行过滤 -->
2.请求和响应设定需转化
HttpServletRequest request = (HttpServletRequest) req;
Cookie[] cookies = request.getCookies();
3.设定全局编码方式
package lne;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Filter implementation class CharacterFilter
*/
public class CharacterFilter implements Filter {
/**
* Default constructor.
*/
public CharacterFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("encoding...");
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//转化为servlet的请求和响应
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//设置请求编码和响应编码
CharacterRequest characterRequest = new CharacterRequest(req);
//pass the request along the filter chain
chain.doFilter(characterRequest, resp);
//chain.doFilter(req, resp);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
//get方式的请求参数放在消息头中,必须通过获取URI参数才能进行设置
class CharacterRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
public CharacterRequest(HttpServletRequest request){
super(request);
this.request=request;
}
public String gerParameter(String name){
//重写获得参数方法
String value = super.getParameter(name);
String method = super.getMethod();
//请求的值不为空且方式是以get提交
if(value!=null && "get".equalsIgnoreCase(method)){
try{
value = new String(value.getBytes("iso-8859-1"),"utf-8");
}catch(UnsupportedEncodingException e){
throw new RuntimeException(e);
}
}
return value;
}
}
Listener监听器,可以监听创建和销毁(lifecycle),增加和删除(Changes to Attributes)
其中在web.xml配置Listener--?需在servlet之前,filter之后?实际操作并没有也可成功
<listener>
<listener-class>lne.Plice</listener-class>
</listener>
在实现implements中可以写发生该事件需要做的操作,可监控servlet&&jsp