javaweb高级第五章 过滤器与事件监听

1.本章目标

  掌握过滤器和监听器的使用

2.过滤器

  生活中:

    网,烟嘴,筛子

  程序中:

    在用户访问资源之前,对访问的请求和响应进行拦截,只有通过了过滤器,才能继续往下执行

    通俗来说,过滤器在客户端和服务器之间加了一层保护层

  案例:

    处理中文乱码

    拦截未登录

    网络直播中,聊天数据,过滤一些敏感的语句

3.开始应用

  步骤:

    1.创建一个普通java类,实现Filter接口,重写doFilter,destory,init方法

      注意:destory和init方法在整个容器的生命周期中只执行一次

    ,doFilter在拦截的请求范围内容,每次请求,都会被执行

    2.在web.xml中配置过滤

       <!-- 配置过滤器 -->
      <filter>
      <!-- 过滤器名称 -->
          <filter-name>TestFilter</filter-name>
          <!-- 过滤器的类 -->
          <filter-class>com.filter.TestFilter</filter-class>
      </filter>
 
      <filter-mapping>
      <!-- 过滤器名称,必须和filter节点中的一样 -->
          <filter-name>TestFilter</filter-name>
          <!-- /*全不过滤 -->
          <url-pattern>/*</url-pattern>
      </filter-mapping>

    3.如果过滤器通过规则校验,放行请求与要在doFilter中:

    chain.doFilter(request, response); 放行代码
     4.如果不想使用上述麻烦的配置步骤,可以新建一个Filter,然后再类上添加如下配置

    @WebFilter(filterName="/EncodingFilter",urlPatterns="/*")

    案例:

添加过滤器,当用户没有登录直接进入欢迎页面时,跳转到登录界面提示用户登录

       

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>千里之行购物网站</title>
    <link rel="stylesheet" href="css/index.css" />
</head>
<body>
    
    <img src="img/bgImg.jpg" class="bgImg" />
    <div class="content" >
        <div class="bidTitle">千里之行购物网站登录</div>
        <form action="demo2Servlet" method="post" role="form" class="form-horizontal">
            <input type="hidden" name="op" value="login">
            <div class="logCon">
                <div class="line" id="username" ><span>账号:</span>
                <input class="bt_input" type="text" name="username"/></div>
                <div class="line" id="password" ><span>密码:</span>
                <input class="bt_input" type="text" name="password"/></div>
                <div class="logCon" style="color: red;">
                    <%
                        String msg=(String)request.getAttribute("msg");
                        if(msg!=null){
                    %>
                        <label class="col-sm-2 control-lable"></label>
                        <div class="col-sm-10">
                            温馨提示:<%=msg %>
                        </div>
                    <%} %>
                </div>
                <button type="su bmit"  class="logingBut">登录</button>
            </div>
        </form>
    </div>
</body>
</html>
登录界面
body {
    text-align: center;
    height: 100%;
}

.bgImg {
    position: absolute;
    top: 0px;
    left: 0px;
    bottom: 0px;
    right: 0px;
    width: 100%;
    height: 100%;
}

.logo {
    width: 800px;
}

.bidTitle {
    color: #e6e6e6;
    font-size: 34px;
    font-weight: 600;
}

.logCon {
    color: #FFFFFF;
    margin-top: 40px;
}

.line {}

body .content {
    width: 42%;
    position: fixed;
    background: #0f1a1494;
    left: 29%;
    padding: 5% 1%;
    margin-top: 12%;
    border-radius: 5px;
}

body .logingBut {
    background: #2d8c5fa6;
    border: none;
    padding: 12px 0px;
    color: #edefee;
    border-radius: 2px;
    width: 330px;
    margin-left: 30px;
    margin-top: 5px;
}

body .bt_input {
    border-radius: 2px;
    border: none;
    padding: 11px 5px;
    width: 330px;
    margin-right: 20px;
    color: #333;
    margin-left: 5px;
    margin-bottom: 18px;
    background: #ffffffd9;
}

body .logCon span {
    font-size: 18px;
    height: 40px;
    line-height: 40px;
}
css样式
package com.Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(name="Demo2Servlet",urlPatterns="/demo2Servlet")
public class Demo2Servlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session =request.getSession();
        String username=request.getParameter("username");
        String password = request.getParameter("password");
        if("张三".equals(username)&&"123456".equals(password)){
            session.setAttribute("login", username);
            request.getRequestDispatcher("welcome.jsp").forward(request, response);
        }else{
            session.setAttribute("error", "用户名或密码错误");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
servlet代码
package com.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Servlet Filter implementation class LoginFilter
 */
@WebFilter(filterName="LoginFilter",urlPatterns="/*")
public class LoginFilter implements Filter {

    public void destroy() {
        
    }

    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //判断是否登录
        HttpServletRequest req=(HttpServletRequest)request;
        HttpSession session=req.getSession();
        Object login=session.getAttribute("login");
        //获取拦截的请求路径,然后排除掉登录的请求(/demo2Servlet)
        String servletPath=req.getServletPath();
        System.out.println(servletPath);
        if(servletPath.equals("/demo2Servlet")||servletPath.contains("/css")||servletPath.contains("/img")){
            chain.doFilter(request, response);
            return;
        }        
        if(login==null){
            session.setAttribute("error", "您没有登录,请登录");
            request.getRequestDispatcher("login.jsp").forward(request, response);        
        }else
        {
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
        
    }

}
过滤器代码

if(servletPath.equals("/demo2Servlet")||servletPath.contains("/css")||servletPath.contains("/img")){
            chain.doFilter(request, response);
            return;
        }   

过滤器 排除过滤 否则一直登陆不进去 以及排除css样式和img样式 !!!

4.监听器,

  监听request,session,application对象的创建和销毁,以及他们的属性变化

  步骤:

    1.实现响应的接口

    2.在web.xml中配置

  整个项目容器运行期间,以下对象产生个数:

    request:每次浏览器请求服务器,就会产生一个新request对象,响应完成,request对象就被销毁;存活于一次请求响应过程

    session:一个浏览器窗口是一个会话.存活于一个浏览器

    application:只有一个

  session会话事件:30分钟

 

 

  

posted @ 2019-03-27 11:47  星梦泪痕  阅读(182)  评论(0)    收藏  举报