2019-8-4 [Java_JSP]Filter过滤器 druid的web监控页面配置

9 篇文章 0 订阅

本文为原创,审核机制抽风,不写转载不让发。

6.JSP拓展 : 过滤器的简单使用

6.1 过滤器概述

6.1.1 什么是过滤器?

Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。

主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。

而在实际使用时,就要特别注意过滤链的执行顺序问题;
在这里插入图片描述

6.1.2 主要作用

在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和据。

在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

所以我们可以利用过滤器,在我们每次真正处理页面请求之前,设定request的编码这样我们就不用挨个servlet设置编码了;

6.2 过滤器概述

6.2.1 创建一个过滤器

在项目的util包中点击鼠标右键,选择 “new” --> “other”
在弹出的窗口中 输入 filter,选择Filter 点击 “next”
在弹出的页面中输入过滤器名称
输入名称后点击 “Finish” 即可

输入代码:

package com.hnxy.web;

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;

public class EncodingFitler implements Filter {
  
    public EncodingFitler() {
        // TODO Auto-generated constructor stub
    }
	public void destroy() {
		// TODO Auto-generated method stub
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}
}

6.2.2 过滤器方法介绍

在这里插入图片描述

1.public void init(FilterConfig filterConfig) throws ServletException

由 Web 容器调用,指示将放入服务中的过滤器。servlet 容器只在实例化过滤器之后调用一次 init 方法。在要求过滤器做任何过滤工作之前,init 方法必须成功完成。如果 init 方法抛出 ServletException或没有在 Web 容器定义的时间段内返回,则 Web 容器无法将过滤器放入服务中。这个和Servlet的生命周期有点类似,也是只初始化一次,destroy()也是执行一次。

2.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException

每次由于对链末尾的某个资源的客户端请求而通过链传递请求/响应对时,容器都会调用 Filter 的 doFilter 方法。传入此方法的 FilterChain 允许 Filter 将请求和响应传递到链中的下一个实体。

此方法的典型实现遵循以下模式:
在这里插入图片描述

3.public void destroy()

由 Web 容器调用,指示将从服务中取出的过滤器。此方法仅在过滤器的 doFilter 方法中的所有线程都已退出之后调用一次,或者在过了超时期之后调用。

在调用此方法之后,Web 容器不会再对此过滤器实例调用 doFilter 方法。
此方法为过滤器提供了一个清除持有的所有资源(比如内存、文件句柄和线程)的机会,并确保任何持久状态都与内存中该过滤器的当前状态保持同步。

6.2.3 过滤器简单使用

1) 修改拦截规则,打开web.xml找到过滤器的配置部分(和servlet很像就是名称不一样)
<filter>
 <display-name>EncodingFitler</display-name>
 <filter-name>EncodingFitler</filter-name>
 <filter-class>com.hnxy.web.EncodingFitler</filter-class>
</filter>
<filter-mapping>
 <filter-name>EncodingFitler</filter-name>
 <url-pattern>/EncodingFitler</url-pattern>
</filter-mapping>

url-Pattern 设置拦截过则 /* 代表任何对servlet的请求 过滤器都要先拦截处理后再交给具体servlet

<filter>
  <display-name>EncodingFitler</display-name>
  <filter-name>EncodingFitler</filter-name>
  <filter-class>com.hnxy.web.EncodingFitler</filter-class>
</filter>
<filter-mapping>
  <filter-name>EncodingFitler</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
2) 编写doFilter方法
/**
 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
 */
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	// 设置请求流编码
	request.setCharacterEncoding("UTF-8");
	chain.doFilter(request, response);
}

完成效果

package com.hnxy.web;

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;

public class EncodingFitler implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 设置请求流编码
		request.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}
}
3) 测试

页面 :

<%@ 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>Insert title here</title>
</head>
<body>
<div>
	<form action="Test1Action" method="post">
		<p>
			请输入名称 : <input type="text" name="userName"  />
		</p>
		<p>
			<button type="submit">提交</button>
		</p>
	</form>
</div>
</body>
</html>

servlet :

package com.hnxy.web;

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;

public class Test1Action extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println(request.getParameter("userName"));
	}
}

我们可以看到,现在servlet没有对数据做任何参数上的处理,如果没有过滤器是这样的:
在这里插入图片描述
设置过滤器前
在这里插入图片描述

6.3 过滤器实战-druid的web监控页面配置

其实我们学习过滤器主要是学过滤器的原理与配置,以后需要我们自己写过滤器的时候很少,都是别的技术写好过滤器我们引用即可,就好比我们现在使用的数据源

druid就是其中之一,druid数据源不光有出色的数据库连接的管理功能,它还有很强悍的web管理功能!现在我们就来简单配置一个druid的web管理功能
很简单一共修改两个地方即可

1) 修改数据库连接类打开SQLweb统计功能

package com.hnxy.utils;

import java.sql.SQLException;
import com.alibaba.druid.pool.DruidDataSource;

/**
 * 数据库连接工具类
 * @author My
 */
public class JdbcUtil {

	// 创建数据库的连接对象
	private static final String CONN_DRIVER = "com.mysql.jdbc.Driver";
	private static final String CONN_URL = "jdbc:mysql://127.0.0.1:3306/userdb?characterEncoding=UTF-8";
	private static final String CONN_USER = "root";
	private static final String CONN_PASSWORD = "root";
		
	// 创建数据源对象
	private static DruidDataSource dataSource = new DruidDataSource();
	
	// 赋值
	static{
		dataSource.setDriverClassName(CONN_DRIVER);
		dataSource.setUrl(CONN_URL);
		dataSource.setUsername(CONN_USER);
		dataSource.setPassword(CONN_PASSWORD);
		// 开启SQL语句的统计功能
        try {
			dataSource.addFilters("stat");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 添加获取数据源的方法
	 * @return
	 */
	public static DruidDataSource getDataSource() {
		return dataSource;
	}	
}

2) web.xml中加入druid的核心servlet和过滤器即可

    <!-- Druid,监控数据库,以及WEB访问连接信息 -->
	<filter>
		<filter-name>DruidWebStatFilter</filter-name>
		<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>DruidWebStatFilter</filter-name>
		<url-pattern></url-pattern>
	</filter-mapping>
	<!-- 配置 Druid 监控信息显示页面 -->
	<servlet>
		<servlet-name>DruidStatView</servlet-name>
		<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
		<init-param>
			<!-- 允许清空统计数据 -->
			<param-name>resetEnable</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<!-- 用户名 -->
			<param-name>loginUsername</param-name>
			<param-value>admin</param-value>
		</init-param>
		<init-param>
			<!-- 密码 -->
			<param-name>loginPassword</param-name>
			<param-value>admin123</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>DruidStatView</servlet-name>
		<url-pattern>/druid/*</url-pattern>
	</servlet-mapping>

配置好之后正常开启tomcat,正常访问项目,你会发现加不加都没有什么问题!你可以先玩一会儿项目,然后在访问下面的地址

http://127.0.0.1:8080/javaweb_class3_tp2/druid
你就会发现druid的管理界面了
在这里插入图片描述
我们设置的是 用户名 admin 密码 admin123 输入即可登录
在这里插入图片描述
登录后显示druid的监控主页面,主页面中可以查看当前数据源,SQL语句性能监控,web 请求URL和HttpSession的监控
SQL监控页面
在这里插入图片描述
HTTP URL监控:
在这里插入图片描述
到此,我们JavaEE的web基础阶段全部完事!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值