过滤器
Servlet实际上分为3中:普通Servlet(MVC),过滤Servlet(FIlter),监听Servlet(Listener)
过滤器实现
1. 过滤操作的使用是自动进行调用的
2. 实现过滤器需要实现 javax.servlet.Filter接口,该接口定义如下处理方法
- 初始化:
public void init(FilterConfig filterConfig) throws ServletException
- 执行过滤操作
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
- 销毁:
public void destroy()
建立一个过滤器
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("******过滤器初始化,初始化参数:" + filterConfig.getInitParameter("msg");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException{
System.out.println("*******执行过滤******");
}
@Override
public void destroy(){
System.out.println("*******过滤器销毁*****");
}
}
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.my.filter.MyFilter</filter-class>
<init-parm>
<param-name>msg</param-name>
<param-value>mlndjava</param-value>
</init-parm>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--过滤执行路径,如果设置为/*,表示所有的根目录下的内容都要求被过滤-->
<url-pattern>/*</url-pattern>
</filter-mapping>
所有的请求到了过滤器后被拦截,要想请求继续放行,需要FilterChain接口中的方法
public void doFilter(ServletRequest req, ServletResponse resp) throws IOException, ServletException
编写编码过滤器
public class EncodingFilter implements Filter {
private String charset = "UTF-8";
@Override
public void init(FilterConfig filterconfig) throws ServletException{
if(filterconfig.getInitParameter("charset")!=null){
this.charset = filterconfig.getInitParameter("charset");
}
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throw IOException, ServletException{
req.setCharacterEncoding(this.charset);
chain.doFilter(req,resp);
resp.setCharacterEncoding(this.charset);
}
@Override
public void destroy(){
}
}
web.xml中配置过滤器
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.my.filter.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
登录过滤
1. 设置过滤目录:例如/pages下的页面都必须登录后访问
2. 实例
- session属于HTTP协议范畴,要将ServletRequest变为HttpServletRequest
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpSession session = request.getSession();
if(session.getAttribute("mid")!=null){//mid存在,代表已经登录
chain.doFilter(request,resp);
}else{
request.setAttribute("msg","你还未登录,请先登录");
request.getRequestDispatcher("/login.jsp").forward(request,resp);
)
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException{
}
@Override
public void destroy(){
}
}
- web.xml中配置filter
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>cn.my.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/pages/*</url-pattern>
</filter-mapping>
- 定义登录页面
<h1>${msg}</h1>
<%
if(request.getParameter("mid")!=null){
session.setAttribute("mid",request.getParameter("mid"));
}
%>
<form action="login" method="post">
登录用户名:<input type="text" name="mid" id="mid">
<input type="submit" value="提交">
</form>