一、过滤器简介
filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理。
二、过滤器快速入门
实现步骤:
(1)编写一个过滤器的类实现Filter接口
(2)实现接口中尚未实现的方法(着重实现doFilter方法)
(3)在web.xml中进行配置(主要是配置要对哪些资源进行过滤)
@WebFilter(filterName = "Filter1",urlPatterns={"/*"})
public class Filter1 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤器入门");
//放行
chain.doFilter(req,resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
三、过滤器的API
Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法:
init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行。
doFilter(ServletRequest,ServletResponse,FilterCha):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法。
destory():代表是filter销毁方法 当filter对象销毁时执行该方法。
Filter对象的生命周期:
Filter何时创建:服务器启动时就创建该filter对象
Filter何时销毁:服务器关闭时filter销毁
总结Filter的作用?
公共代码的提取
可以对request和response中的方法进行增强(装饰者模式/动态代理)
进行权限控制
四、案例:自动登录
首先是正常的登录,检查是否勾选了自动登录:
@WebServlet(name = "Login",
urlPatterns = {"/Login"})
public class Login extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//验证码校验
//获得页面输入的验证
String checkCode_client = request.getParameter("checkCode");
//获得生成图片的文字的验证码
String checkCode_session = (String) request.getSession().getAttribute("checkcode_session");
//比对页面的和生成图片的文字的验证码是否一致
if(!checkCode_session.equals(checkCode_client)){
request.setAttribute("loginInfo", "您的验证码不正确");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
request.setCharacterEncoding("UTF-8");
//1、获得用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//2、调用一个业务方法进行该用户查询
User login1 = null;
try {
login1 = login(username,password);
} catch (SQLException e) {
e.printStackTrace();
}
//3、通过user是否为null判断用户名和密码是否正确
if(login1!=null){
//判断用户是否勾选自动登录
String autoLogin = request.getParameter("autoLogin");
if(autoLogin!=null){
//对中文张三进行编码
String username_code = URLEncoder.encode(username, "UTF-8");// %AE4%kfj
javax.servlet.http.Cookie cookie_username = new javax.servlet.http.Cookie("cookie_username",username_code);
javax.servlet.http.Cookie cookie_password = new javax.servlet.http.Cookie("cookie_password",password);
//设置cookie的持久化时间
cookie_username.setMaxAge(60*60);
cookie_password.setMaxAge(60*60);
//设置cookie的携带路径
cookie_username.setPath(request.getContextPath());
cookie_password.setPath(request.getContextPath());
//发送cookie
response.addCookie(cookie_username);
response.addCookie(cookie_password);
}
//用户名和密码正确
//登录成功 跳转到网站的首页
response.sendRedirect(request.getContextPath()+"/index.jsp");
//用户登录成功之后放入到Session中
HttpSession session = request.getSession();
session.setAttribute("user",login1);
}else
{
//用户名或密码错误
//跳回当前login.jsp
request.setAttribute("loginInfo","用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
public User login(String username,String password) throws SQLException {
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user where username=? and password=?";
User user = runner.query(sql,new BeanHandler<User>(User.class),username,password);
return user;
}
}
编写过滤器:
@WebFilter(filterName = "Filter2",urlPatterns={"/*"})
public class AutoLoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest req1 = (HttpServletRequest) req;
HttpServletResponse resp1 = (HttpServletResponse) resp;
HttpSession session = req1.getSession();
//获得cookie中用户名和密码 进行登录的操作
//定义cookie_username
String cookie_username = null;
//定义cookie_password
String cookie_password = null;
//获得cookie
Cookie[] cookies = req1.getCookies();
if(cookies!=null){
for(Cookie cookie : cookies){
//获得名字是cookie_username和cookie_password
if("cookie_username".equals(cookie.getName())){
cookie_username = cookie.getValue();
//恢复中文用户名
cookie_username = URLDecoder.decode(cookie_username, "UTF-8");
}
if("cookie_password".equals(cookie.getName())){
cookie_password = cookie.getValue();
}
}
}
//判断username和password是否是null
if(cookie_username!=null&&cookie_password!=null){
//登录的代码
UserService service = new UserService();
User user = null;
try {
user = service.login(cookie_username,cookie_password);
} catch (SQLException e) {
e.printStackTrace();
}
//将登录的用户的user对象存到session中
session.setAttribute("user", user);
}
//放行
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
转载请标明出处,原文地址:https://blog.csdn.net/weixin_41835916 如果觉得本文对您有帮助,请点击顶支持一下,您的支持是我写作最大的动力,谢谢。