过滤器Filter(重点)

导读:本篇文章讲解 过滤器Filter(重点),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

过滤器Filter(重点)

Filter过滤器:用来过滤网站的数据;

  • 处理中文乱码
  • 登录验证…
    在这里插入图片描述

1:Filter开发过程;

1:导包;(Servlet下的包)
2:编写过滤器
在这里插入图片描述
实现Filter接口,重写对应的方法即可

public class CharacterEncodingFilter implements Filter {


    //初始化: web服务器启动,就已经初始化了,随时等待过滤器对象的出现!
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化");
    }


    //Chain: 链
    /*
    1: 过滤中的所有代码,在过滤特定请求的时候都会执行;
    2:必须要让过滤前继续执行。
     filterChain.doFilter(servletRequest,servletResponse);
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");

        System.out.println("CharacterEncodingFilter执行前");
        filterChain.doFilter(servletRequest,servletResponse);

        System.out.println("CharacterEncodingFilter执行后");



    }

    //销毁 : web服务器关闭的时候,会销毁;
    @Override
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁");
    }
}

3:在web.xml 中配置Filter

这里我们要过滤哪个包下的程序,就写哪个包。

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>

    <!--只要是 /servlet 的任何请求,会经过这个过滤器-->
    <url-pattern>/servlet/*</url-pattern>
</filter-mapping>

4:创建一个Servlet包,过滤字符集的字符集编码问题。

public class ShowServlt extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.getWriter().write("你好啊,世界!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

5: 配置web.xml 文件;

    <servlet>
        <servlet-name>ShowServlt</servlet-name>
        <servlet-class>com.kuang.servlet.ShowServlt</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ShowServlt</servlet-name>
        <url-pattern>/servlet/show</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ShowServlt</servlet-name>
        <url-pattern>/show</url-pattern>
    </servlet-mapping>

小结:当我们启动Tomcat,运行测试结果,请求 /show 时会发现字符集乱码,
请求 /servlet/show 时字符集不乱码。这时就能表明,程序被过滤了。servlet下的包都会被 fliter过滤

过滤器的Demo

需求:
用户登录之后进入页面。用户注销之后,就不能进入页面了。

思路:
1:用户登录之后,向session中存放数据。
2:进入主页之后,要判断用户是否已经登录成功。要求在过滤器中实现。

 - 输入用户名,要么登录成功,要么登录失败
 - 登录,要求用过滤器实现。
 - 登录成功之后,向Session中存放数据。用途是:注销的时候移除Session。
 - 跳转到登录成功页面。
 - 当点击注销的时候,要求用过滤器判断session,并跳转到首页
 - 登录失败,返回错误页面。重新登录等。

实现过程:

1:创建一个登陆的页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h1>登录页面</h1>

<form action="/servlet/login" method="post">
    <input type="text" name="username">
    <input type="submit">
</form>

</body>
</html>

当我们点击按钮,提交页面的时候,页面跳转到 /servlet/login

2:创建一个LoginServlet的类,并配置web.xml文件

创建一个LoginServlet类

public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获取前端请求的参数
        String username = req.getParameter("username");

        if(username.equals("admin")){
            //登录成功
            req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
            resp.sendRedirect("/sys/success.jsp");

        }else {
            //登录失败
            resp.sendRedirect("/error.jsp");

        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

登录不成功的页面
在web下创建

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h1>错误</h1>
<h3>没有权限,或者用户名错误!</h3>


<a href="/login.jsp">返回登录页</a>

</body>
</html>

配置web.xml。文件

<servlet>
         <servlet-name>LoginServlet</servlet-name>
         <servlet-class>com.kuang.servlet.LoginServlet</servlet-class>
     </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/servlet/login</url-pattern>
    </servlet-mapping>

测试结果:

登录,要求用过滤器实现。
只需要将过滤的类放入指定的过滤器的地方就可以了。
配置过滤器:

public class CharacterEncodingFilter implements Filter {


    //初始化: web服务器启动,就已经初始化了,随时等待过滤器对象的出现!
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化");
    }


    //Chain: 链
    /*
    1: 过滤中的所有代码,在过滤特定请求的时候都会执行;
    2:必须要让过滤前继续执行。
     filterChain.doFilter(servletRequest,servletResponse);
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");

        System.out.println("CharacterEncodingFilter执行前");
        filterChain.doFilter(servletRequest,servletResponse);

        System.out.println("CharacterEncodingFilter执行后");



    }

    //销毁 : web服务器关闭的时候,会销毁;
    @Override
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁");
    }

    
    
  <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>

      <!--只要是 /servlet 的任何请求,会经过这个过滤器-->
      <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>

这里说明:servlet中的类,都会被过滤器过滤。比如我们的字符集编码过滤,注销后的session过滤实现。

3:注销实现
登录页面后,添加一个注销的实现。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--<%--%>
    <%--Object attribute = request.getSession().getAttribute("USER_SESSION");--%>
    <%--if (attribute == null){--%>
        <%--response.sendRedirect("/login.jsp");--%>
    <%--}--%>
<%--%>--%>

<h1>主页,登录成功!</h1>

<p><a href="/servlet/logout">注销</a></p>

</body>
</html>

编写一个注销的类,配置web.xml文件

public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获取前端请求的参数
        String username = req.getParameter("username");

        if(username.equals("admin")){
            //登录成功
            req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
            resp.sendRedirect("/sys/success.jsp");

        }else {
            //登录失败
            resp.sendRedirect("/error.jsp");

        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

配置web.xml

   <servlet>
       <servlet-name>LoginoutServlet</servlet-name>
       <servlet-class>com.kuang.servlet.LoginoutServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>LoginoutServlet</servlet-name>
       <url-pattern>/servlet/logout</url-pattern>
   </servlet-mapping>

filter过滤注销 的实现(session)

public class SysFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        Object user_session = request.getSession().getAttribute("USER_SESSION");
        if (user_session == null){
            response.sendRedirect("/error.jsp");
        }

        filterChain.doFilter(request,response);


    }

    @Override
    public void destroy() {

    }

   <filter>
       <filter-name>SysFilter</filter-name>
       <filter-class>com.kuang.filter.SysFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>SysFilter</filter-name>
       <url-pattern>/sys/*</url-pattern>
   </filter-mapping>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71895.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!