javaweb--过滤器filter/监听器

一、过滤器filter

1、编写字符编码过滤器

编写一个实现servlet接口的程序

public class ServletShow extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("你好,世界!");
    }

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

可以发现在网页打印出来的为乱码
在这里插入图片描述
1、用过滤器进行编码设置,使得打印出来的为正常中文

public class FilterDemo implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter 已经初始化了");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      request.setCharacterEncoding("utf-8");
      response.setCharacterEncoding("utf-8");
      response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request,response);

    }

    @Override
    public void destroy() {
        System.out.println("filter 已经销毁了");
    }

此处要注意导包不能错,为javax.servlet 下
通过运行可以得出以下结论:

1、初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
2、过滤中的所有代码,在过滤特定请求的时候都会执行, 必须要让过滤器继续同行chain.doFilter(request,response);
3、销毁:web服务器关闭的时候,过滤会销毁

2、在web.xml中配置 Filter

<servlet>
    <servlet-name>show</servlet-name>
    <servlet-class>com.zhoudan.ServletShow</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>show</servlet-name>
    <url-pattern>/show</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>show</servlet-name>
    <url-pattern>/sys/show</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>filter</filter-name>
    <filter-class>com.zhoudan.FilterDemo</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>filter</filter-name>
  <url-pattern>/sys/*</url-pattern>
</filter-mapping>

只要是 /servlet的任何请求,会经过这个过滤器

2、实现权限拦截的过滤器

用户登录之后才能进入主页!用户注销后就不能进入主页了!

  1. 用户登录之后,向Sesison中放入用户的数据

  2. 进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现!

登录页面为:login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录首页</title>
</head>
<body>
<form action="/servlet/login" method="post">
    登录:<input type="text" name="username" ><br>
    <input type="submit" value="登录" >
</form>
</body>
</html>

登录成功的页面:主页 /可以实现注销
success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
     <h1>主页</h1>
     <a href="/servlet/layout">注销</a>
</body>
</html>

登录失败的页面:error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>错误</title>
</head>
<body>
  <h1>用户名错误,或者没有权限!</h1>
</body>
</html>

当登录成功之后,页面要跳转到首页,要实现用户数据的保存,就要编写以下servlet
LoginDemo:

public class LoginDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获得参数
        String userName = req.getParameter("username");
        //放进session中
        req.getSession().setAttribute("username",userName);
        //进行判断
        if(userName.equals("admin")){
            resp.sendRedirect("/sys/success.jsp");
        }else {
            resp.sendRedirect("/error.jsp");
        }
    }

在web.xml中注册的servlet路径为登录成功后,跳转的路径

<servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>com.zhoudan.LoginDemo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/servlet/login</url-pattern>
  </servlet-mapping>

登录成功之后还要实现注销功能:将用户数据进行移除,并返回首页。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //注销就把用户进行移除
        HttpSession session = req.getSession();
        Object userName =session.getAttribute("username");
        if(userName!=null){
            session.removeAttribute("username");
            resp.sendRedirect("/login.jsp");
        }else {
            resp.sendRedirect("/login.jsp");

        }
    }

在web.xml中注册的servlet路径

<servlet>
    <servlet-name>layout</servlet-name>
    <servlet-class>com.zhoudan.LayoutDemo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>layout</servlet-name>
    <url-pattern>/servlet/layout</url-pattern>
  </servlet-mapping>

但是,通过运行,可以发现注销之后,直接登录成功页面是可以实现的,就没有达到权限拦截的效果,所以引入滤波器进行权限的拦截

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

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    //过滤器实现权限拦截  如果得到的session用户为null,就直接进入错误,不可以进登录成功的页面
        chain.doFilter(request,response);
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp= (HttpServletResponse) response;
        HttpSession session = req.getSession();
        if(session.getAttribute("username")==null){
            resp.sendRedirect("/error.jsp");
        }

    }

    @Override
    public void destroy() {

    }
}
<!--注册过滤器-->
  <filter>
    <filter-name>filter2</filter-name>
    <filter-class>com.zhoudan.filter.FilterDemo2</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/sys/*</url-pattern>
  </filter-mapping>

运行结果如下:
登录的页面为:
在这里插入图片描述
主页为:
在这里插入图片描述
错误页面为:
在这里插入图片描述
注销之后,便不能直接进入主页,会进入错误页面!!

二、监听器

1、编写一个监听器,实现监听器的接口

//统计在线人数 一个session对应一个在线人数
public class ListenerDemo implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();

        System.out.println(se.getSession().getId());

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if (onlineCount == null) {
            onlineCount = new Integer(1);
        } else {
            int count = onlineCount.intValue();
            onlineCount = new Integer(count + 1);
        }

        ctx.setAttribute("OnlineCount", onlineCount);
    }


    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if (onlineCount == null) {
            onlineCount = new Integer(0);
        } else {
            int count = onlineCount.intValue();
            onlineCount = new Integer(count - 1);
        }

        ctx.setAttribute("OnlineCount", onlineCount);
    }
}

此程序做到了两点:

1、创建session监听: 看你的一举一动,一旦创建Session就会触发一次这个事件!
2、销毁session监听:一旦销毁Session就会触发一次这个事件!

2、web.xml中注册监听器

<listener>
    <listener-class>com.zhoudan.ListenerDemo</listener-class>
  </listener>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值