通过过滤器Filter拦截非法访问web资源请求和设置编码

首先我们先了解过滤器Filter与Serlet的区别
/*
 * 功能区别:
* Serlet用于处理业务逻辑的
* Filter用于拦截、检查和处理请求和响应
 * 代码区别:
* Filter生命周期函数多出了doFilter()
* Filter的init()和Serlet的init()执行的时间不一样,servlet在客户端第一次访问servlet时,此servlet调用init初始化,Filter在web服务器(在这里我们使用tomcat)启动时就调用init初始化
 * web.xml配置区别 
* Servlet的url-pattern表示访问路径
* Filter的url-pattern表示过滤器过滤范围。即过滤某个目录

 * */

接下来,我们需要在eclipse中创建web项目Filter_login。在WebContent目录中创建以下两个jsp页面。

index.jsp

<%@ 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>
<title>Insert title here</title>
</head>
<body>
	<%
		Boolean islogin = (Boolean) session.getAttribute("islogin");
		if (islogin == null || islogin == false)
		{
			/* 用户未登录 */
			response.sendRedirect("login.jsp");
		}
	
	%>

	<!-- 用户已登录 -->
	<h1>欢迎来到首页</h1>
</body>
</html>

login.jsp

<%@ 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>
<title>Insert title here</title>
</head>
<body>
	<form action="LoginServlet" method="post">
		name: <input type="text" name="name">
		password: <input type="text" name="password">
		<input type="submit" value="提交">
	</form>
</body>
</html>


我们对以上login.jsp进行登录验证,需要创建一个LoginServlet.java的Servlet文件,代码如下:

LoginServlet.java

package com.wen;
/**
 * 通过session设置访问标识符,只有login.jsp输入用户名和密码,,并且通过LoginServlet验证登陆信息正确后才能访问index.jsp*/
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;

public class LoginServlet extends HttpServlet
{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		// 1.接收请求,获取数据
		String name = req.getParameter("name");
		String password = req.getParameter("password");

		// 2.判断数据是否正确(可能涉及数据库)
		// 3.根据判断结果跳转页面
		if (name.equals("wen") && password.equals("123"))
		{
			// 登录成功,跳转到主页,需要改变地址和页面,Response的sendRedirect重定向页面
			HttpSession session =req.getSession();
			session.setAttribute("islogin", true);
			resp.sendRedirect("index.jsp");
		} else
		{

			// 登录失败,转回到首页
			resp.getWriter().println("<script>window.history.back()</script>");// resp.sendRedirect("login.jsp");
		}
	}
}


接下来开始创建过滤器。

首先先了解过滤器的实现步骤:

   1、自定义类实现Filter接口并实现init();doFilter();destroy;三个方法

   2、在web.xml中配置Filter,与Servlet配置类似,只是配置标签为<filter***>

在这里我们分别创建两个过滤器,一个用来拦截和过滤用户请求,一个用来设置编码。

其中FirstFilter.java用来拦截和过滤用户请求;EncodingFilter.java用来设置编码

在src中创建一个包com.wen,然后在包里创建一个FirstFilter.java和EncodingFilter.java文件,并实现Filter接口,代码如下:


FirstFilter.java

package com.wen;
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 FirstFilter implements Filter
{
	/*与servlet初始化的区别:
	  servlet在客户端第一次访问servlet时,此servlet调用init初始化
	  Filter在tomcat启动时就调用init初始化
	*/
	@Override
	public void init(FilterConfig arg0) throws ServletException
	{
		System.out.println("init");
		
	}

	//进行过滤动作,只要有请求通过该此过滤器,那么过滤器的doFilter就会执行
    //第三个参数FilterChain chain是用于放行请求的
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException
	{
		System.out.println("doFilter");
		//如果不写doFilter ,则过滤器默认会拦截请求
		chain.doFilter(request, response);//放行请求,请求通过过滤器,并且能够到达具体资源	
	}

	@Override
	public void destroy()
	{
		System.out.println("destroy");	
	}

}

EncodingFilter.java

package com.wen;

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 EncodingFilter implements Filter
{
	@Override
	public void init(FilterConfig arg0) throws ServletException
	{
		System.out.println("init");
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException
	{
		//设置编码
		request.setCharacterEncoding("utf-8");
		//放行
		chain.doFilter(request, response);
	}

	@Override
	public void destroy()
	{
		System.out.println("destroy");
		
	}
}


以上步骤都完成之后,需要在WebContent\WEB-INF下的web.xml中对LoginServlet.java、FirstFilter.java和EncodingFilter.java三个文件进行配置。配置如下:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>02Filter_login</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!--配置Filter过滤器-->
  <filter>
  	<filter-name>FirstFilter</filter-name>
  	<filter-class>com.wen.FirstFilter</filter-class>
  </filter>
      <!-- 过滤器没有访问路径,因为过滤器根本不是让用户访问的,
    	而是在服务器运行中提供对请求和响应拦截检查处理功能的 
    	url-pattern在这里表示过滤器过滤范围。即过滤某个目录
      -->
  <filter-mapping>
    <filter-name>FirstFilter</filter-name>
    <url-pattern>/*</url-pattern><!-- 表示过滤当前整个web应用资源 -->
  </filter-mapping>
  
    <filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>com.wen.EncodingFilter</filter-class>
  </filter>
      <!-- 过滤器没有访问路径,因为过滤器根本不是让用户访问的,
    	而是在服务器运行中提供对请求和响应拦截检查处理功能的 
    	url-pattern在这里表示过滤器过滤范围。即过滤某个目录
      -->
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern><!-- 表示过滤当前整个web应用资源 -->
  </filter-mapping>
  
  
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.wen.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
</web-app>


OK,以上整个项目的创建完成。

猜你喜欢

转载自blog.csdn.net/Mryuxuan/article/details/80723525