过滤器的详解以及实现(样式问题解决方法在代码注释中!)
过滤器
过滤器 (filter)是一个程序,它先于与它相关的servlet或jsp页面运行在服务器上,当服务器启动时,加载web.xml时过滤器就被加载了
- 过滤器中三个方法:
- 1.init():初始化调用,在tomcat启动时自动被调用。
- destroy():销毁方法
- doFilter():处理请求
过滤器就是个特殊的servlet
过滤器对客户的请求进行处理,处理完成后,它会交给下一个过滤器处理,这样客户的请求在过滤器链里逐个处理,直到请求发送到目标为止。
过滤器应用:
实际开发过程中,过滤器可以用来对用户进行统一的身份判断,ip访问限制、用户发送请求的字符编码转换、对请求和响应信息进行加密和解密、记录用户的登录日志等等。
过滤器调用顺序是web.xml中配置的顺序
过滤器的实现
接下来给大家上一段代码,是一个简单的登录,注册过滤,大家可以直接拷贝到项目中更改路径就可以使用
import java.io.IOException;
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.HttpSession;
public class Filter implements javax.servlet.Filter {
public Filter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
// 转化为我们习惯用的request和response对象(个人习惯)
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
// 设置编码格式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//获取传来的请求
String uri = request.getRequestURI();
// 对请求的字符串进行截取 例如http://localhost:8080/aaa/bbb.jsp中我们想要的请求字符串为bbb.jsp
uri = uri.substring(uri.lastIndexOf("/")+1);
// 放行登录注册界面和请求以及相对应的效验请求还有css样式!!!很多人加了过滤器没有放行样式所以导致样式都没了
// 解决方法放行样式:如下
if (uri.equals("login.jsp") || uri.equals("checkUserTele.do") || uri.equals("reguser.do")
|| uri.equals("checkUserCardId.do") || uri.equals("userLogin.do") || uri.equals("insertUser.do")
|| uri.indexOf(".jpg") > 0 || uri.indexOf(".jpeg") > 0 || uri.indexOf(".png") > 0
|| uri.indexOf(".gif") > 0 || uri.indexOf(".css") > 0
|| uri.indexOf("js") > 0) {
// 放行到下一个过滤器,如果是最后一个,跳转到对应请求处理方法
chain.doFilter(request, response);
return;
}
//session检查,看session中是否有登录过的用户
HttpSession session = request.getSession();
// 我的登录方法中,登录成功就往session中存一个用户信息,key为login
Object object = session.getAttribute("login");
if (object == null) {
// 没有就跳转到登录
response.sendRedirect("login.jsp");
}else{
// 有就向下执行
chain.doFilter(request, response);
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
现在虽然我们写好了过滤器,但是并没有起作用,我们还需要让工程指导过滤器的存在,所以我们要在web.xml中配置,上文提到过了 过滤器的执行顺序就是web.xml中配置的顺序,所以放在第一个过滤器,也就是web-app标签下的第一个
<!-- 登录过滤器 -->
<filter>
<display-name>Filter</display-name>
<filter-name>Filter</filter-name>
<!-- 下面就是你过滤器的路径,双击你的过滤器类名拷贝一下路径 -->
<filter-class>com.cyz.filter.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<!-- 下面是想拦截的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
以上整个过滤器就已经成功在你项目中成功引用了
也可以通过使用*.do来过滤请求,
这样如果我们在页面中的请求中添加后缀名.do就可以避免对静态资源的过滤了,也就不需要对静态资源做特殊处理了.
感谢大家的支持!