代码改变世界

java web开发技术1——过滤器

2017-07-06 12:13  核桃不是桃  阅读(219)  评论(0)    收藏  举报

过滤器包括:过滤源、过滤规则及过滤结果。

web过滤器的过滤源是指用户请求,过滤器本身并不会处理请求,只是进行一些辅助的操作。

例如检测用户是否登录。

再比如将404等错误界面进行处理之后展示给用户。

过滤器的定义:过滤器是一个服务器端的组件,他可以截取用户端的请求与响应信息,并对这些信息进行过滤

工作原理

过滤器在web程序启动时,从web容器中加载。用户发送请求时,进入过滤器判断之后发送给web资源(服务器)。web资源响应发送给过滤器,之后在通过处理发送给用户。

生命周期

过滤器的生命周期分四种,分别是:

  • 实例化:通过在web.xml中配置,在web容器加载时实例化一次,
  • 初始化:实例化完成后,调用过滤器的init方法,进行一些初始化操作,
  • 过滤:doFilter方法,执行N次,每次捕获请求时都会执行此方法。
  • 销毁:destroy方法,在web容器关闭时调用销毁方法。

过滤器的分类

  • REQUEST:用户直接访问页面时,web容器将会调用
  • FORWARD:目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用
  • INCLUDE:目标资源是通过RequestDispatcher的include方法调用时,该过滤器将被调用
  • ERROR:目标资源是通过声明式异常处理机制调用时,过滤器将被调用

登录认证实战案例

过滤器在实际项目中的应用场景

  1. 对用户请求进行统一认证
  2. 编码转发
  3. 对用户发送的数据进行过滤替换
  4. 转换图像格式
  5. 对响应的内容进行压缩

登录验证案例

需求是这样的,用户在登陆页面登陆正确跳转到成功页面,否则跳转到失败页面。但是当用户未登录时访问成功页面url会跳转到登录页面。

首先创建一个serlvet,验证当用户输入用户名和密码都是admin登陆成功,否则登录失败。代码如下:

package com.demo.serlvet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * Created by 24102 on 2017/7/6.
 */
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("admin".equals(username) && "admin".equals(password)){
            //校验成功
            HttpSession session = req.getSession();
            session.setAttribute("username",username);
            resp.sendRedirect( req.getContextPath() + "/success.jsp");
        }else{
            //校验失败
            resp.sendRedirect( req.getContextPath() + "/fail.jsp");
        }
    }
}

在web.xml中进行相应的配置:

  <servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>com.demo.serlvet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/servlet/LoginServlet</url-pattern>
  </servlet-mapping>

登录页面login.jsp是一个简单的登陆表单,包括用户名和密码

<form action="<%=request.getContextPath() %>/servlet/LoginServlet" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" value="提交">
</form>

以上代码就能实现根据用户名和密码是否正确跳转到相应的页面,还需要success.jsp和fail.jsp这两个文件,只需要在页面中添加相应的简单的标识文字。

要实现判断用户未登录时访问success.jsp跳转到登陆界面,需要用到过滤器。

创建过滤器LoginServlet:

package com.demo.serlvet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * Created by 24102 on 2017/7/6.
 */
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("admin".equals(username) && "admin".equals(password)){
            //校验成功
            HttpSession session = req.getSession();
            session.setAttribute("username",username);
            resp.sendRedirect( req.getContextPath() + "/success.jsp");
        }else{
            //校验失败
            resp.sendRedirect( req.getContextPath() + "/fail.jsp");
        }
    }
}

然后需要在web.xml中添加相应的配置:

  <filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.demo.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>/success.jsp</url-pattern>
  </filter-mapping>

再次测试就发现实现需求了。还是很简单的。