回顾Servlet之Filter

回顾Servlet之Filter

参考网址: https://blog.csdn.net/zziamalei/article/details/23905427?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160015704019195162162243%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160015704019195162162243&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-6-23905427.pc_ecpm_v3_pc_rank_v3&utm_term=servlet%E7%9A%84filter%E5%85%A5%E9%97%A8demo&spm=1018.2118.3001.4187

前提:

我是在基础的javaweb环境下进行的demo测试

在eclipse建一个动态的web工程

1.入门demo

1.1写一个自定义的Filter

说明:

Filter是一个接口

import javax.servlet.Filter;

在javax.servlet下,别导错包

  • 自定义MyFilter实现Filter接口
package com.shaoming.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;

public class MyFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("Filter 的   init   方法");

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("Filter 的   doFilter   方法");
		

	}

	@Override
	public void destroy() {
		System.out.println("Filter 的   destroy   方法");

	}

}

  • 在web.xml配置过滤器

说明:

web.xml配置过滤器和配置servlet差不多

/*

/* 表示拦截所有请求

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.shaoming.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

1.2写一个servlet进行测试

package com.shaoming.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 */
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// >>处理POST请求参数乱码
		 request.setCharacterEncoding("utf-8");
		// >>处理响应正文乱码
		 response.setContentType("text/html;charset=utf-8");
		// TODO...
//		String filterName = request.getParameter("filtername");
//		System.out.println("在servlet中获取filtername的值为:   "+filterName);
		String name = request.getParameter("name");
		System.out.println("getParameter的name的值为:   " + name);
		System.out.println("MyServlet里面处理请求");
		PrintWriter out = response.getWriter();
		out.write("Helloworld 你好 世界!!!!");

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

说明:

此时访问http://localhost:8080/项目名称/MyServlet

该请求被拦截

1.3访问servlet测试

两种情况可以访问到MyServlet

1.3.1web.xml配置放行MyServlet

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.shaoming.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <!--拦截不到MyServlet-->
    <url-pattern>/otherservlet</url-pattern>
  </filter-mapping>

说明

/otherservlet

表示只拦截otherservlet,别的都放行

1.3.2使用Filer核心方法放行

在MyFilter的doFilter方法里面设置放行的方法

@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("Filter 的   doFilter   方法     before");
        //放行
		chain.doFilter(request, response);
         System.out.println("Filter 的   doFilter   方法     after");
	}

说明

放行的核心方法

chain.doFilter(request, response);

  • 控制台打印:
Filter 的   doFilter   方法     before
getParameter的name的值为:   null
MyServlet里面处理请求
Filter 的   doFilter   方法     after

1.4访问页面测试

  • 定义一个html页面

testfilter.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>
测试过滤器是否拦截html页面
</h1>
</body>
</html>
  • 访问http://localhost:8080/java-web2/testfilter.html

    可以访问到该页面

结论:

过滤器过滤不了html等页面

2.Filter解决中文乱码

2.1 写一个自定义的Filter

package com.shaoming.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;

public class MyFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("Filter 的   init   方法");

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("Filter 的   doFilter   方法");
		// >>处理POST请求参数乱码
		request.setCharacterEncoding("utf-8");
		System.out.println("处理POST请求参数乱码");
		// >>处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");
		System.out.println("处理响应正文乱码");
		// TODO...
		request.setAttribute("filtername", "MyFilter");
		String name = (String) request.getAttribute("filtername");
		System.out.println("filter里面的name的值为: "+name);
		chain.doFilter(request, response);
		System.out.println("doFilter after");
	}

	@Override
	public void destroy() {
		System.out.println("Filter 的   destroy   方法");

	}

}

2.2 写一个servlet

package com.shaoming.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 */
public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
        //注释解决中文乱码的内容,让过滤器处理中文乱码
		// >>处理POST请求参数乱码
		 //request.setCharacterEncoding("utf-8");
		// >>处理响应正文乱码
		// response.setContentType("text/html;charset=utf-8");
		// TODO...
        //获取不到Filter里面的参数的值
//		String filterName = request.getParameter("filtername");
//		System.out.println("在servlet中获取filtername的值为:   "+filterName);
		String name = request.getParameter("name");
		System.out.println("getParameter的name的值为:   " + name);
		System.out.println("MyServlet里面处理请求");
		PrintWriter out = response.getWriter();
		out.write("Helloworld 你好 世界!!!!");

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

2.3测试

  • Filter不处理中文乱码

页面内容

Helloworld !!!

  • Filter处理中文乱码

页面内容

Helloworld 你好 世界!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值