Java Web学习(35):Filter学习(二)

与Filter相关的接口

FilterConfig接口

getInitParamter():获取初始化参数,

getFilterName():获取过滤器名称,

getServletContext():获取application,

FilterChain接口

doFilter(ServletRequest,ServletResponse):放行,相当于调用了目标Servlet的service()方法。

过滤器的四种拦截方式

1拦截请求REQUEST(默认)

2拦截转发FOWARD

3拦截包含INCLUDE

4拦截错误ERROR

在<filter-mapping>中进行配置。例如:<dispatcher>FOWARD</dispatcher>

当然也可以在注解中进行配置。

过滤器分类

Servlet2.5

REQUEST——用户直接访问页面时,Web容器将会调用该过滤器

FORWARD——目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用

INCLUDE——目标资源是通过RequestDispatcher的include方法调用时,该过滤器将被调用

ERROR——目标资源是通过声明式异常处理机制时,过滤器将被调用

Servlet3.0在Servlet2.5基础上加了下面的一项:

ASYNC——支持异步处理

@WebFilter

@WebFilter用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将会根据具体的属性配置将相应

的类部署为过滤器。

使用注解和配置web.xml的对比:

@WebFilter的常用属性:

使用注解的例子:

@WebFilter(filterName="LoginFilter",urlPatterns={"/success.jsp"})

@WebFilter(filterName="FilterDemo",urlPatterns={"/*"},dispatcherTypes={DispatcherType.REQUEST})

过滤器在实际项目中的应用场景

1对用户请求进行统一认证

2编码转换

3对用户发送的数据进行过滤替换

4转换图像格式

5对响应的内容进行压缩

简单登录认证和编码转换实例

LoginServlet.java源代码:

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;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet(name="LoginServlet",urlPatterns={"/LoginServlet"})
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");//防止中文乱码

		String username = request.getParameter("username");
		String password = request.getParameter("password");

		System.out.println(username);

		if("李思思".equals(username) && "123456".equals(password)){
			//校验通过
			HttpSession session = request.getSession();
			session.setAttribute("username", username);
			//请求重定向
			response.sendRedirect(request.getContextPath()+"/success.jsp");
		}else{
			//校验失败
			response.sendRedirect(request.getContextPath()+"/failure.jsp");
		}
	}

}

LoginFilter.java源代码:

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.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet Filter implementation class FilterDemo
 */
@WebFilter(filterName="LoginFilter",urlPatterns={"/success.jsp"})
public class LoginFilter implements Filter {

	private FilterConfig config;

    /**
     * Default constructor. 
     */
    public LoginFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest hrequest = (HttpServletRequest)request;
		HttpServletResponse hresponse = (HttpServletResponse) response;
		HttpSession session = hrequest.getSession();

		String noLoginPaths = config.getInitParameter("noLoginPaths");

		//字符编码
		String charset = config.getInitParameter("charset");
		if(charset==null){
			charset = "UTF-8";
		}
		hrequest.setCharacterEncoding(charset);

		if(noLoginPaths!=null){
			String[] strArray = noLoginPaths.split(";");
			for (int i = 0; i < strArray.length; i++) {
				if(strArray[i]==null || "".equals(strArray[i])){
					continue;
				}

				if(hrequest.getRequestURI().indexOf(strArray[i])!=-1 ){
					chain.doFilter(request, response);
					return;
				}
			}

		}

		if(session.getAttribute("username")!=null){
			chain.doFilter(request, response);
		}else{
			hresponse.sendRedirect(hrequest.getContextPath()+"/login.jsp");
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
		config = fConfig;
	}

}

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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
     <form action="<%=request.getContextPath() %>/LoginServlet" method="post">
      用户名:<input type="text" name="username"><br/>
      密码:<input type="password" name="password"><br/>
                 <input type="submit" value="提交"> 
     </form>
</body>
</html>

success.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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>成功页面</title>
</head>
<body>
         <h1>登录成功,欢迎您<font color="red">${username}</font></h1>
</body>
</html>

failure.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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>失败页面</title>
</head>
<body>
      <h1>登录失败,请检查用户名和密码!</h1>
</body>
</html>

运行结果:

粗粒度的权限控制

RBAC->基于角色的权限控制说明

我们给出三个页面default.jsp、user.jsp、admin.jsp

default.jsp:谁都可以访问,没有限制

user.jsp:只有登录用户才可以访问

admin.jsp:只有管理员才可以访问

代码实现:

LoginServlet1.java源代码:

package com.servlet;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet1
 */
@WebServlet(name="LoginServlet1",urlPatterns={"/LoginServlet1"})
public class LoginServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=UTF-8");
		//1获取用户名
		String username = request.getParameter("username");
		//2判断用户名中时候包含admin,如果包含就是管理员,如果不包含,则是普通会员
		//3要把登录的用户名保存到session中
		if(username.contains("guanliyuan")){
			request.getSession().setAttribute("admin", username);
		}else {
			request.getSession().setAttribute("username", username);
		}
		//4转发到default.jsp
		request.getRequestDispatcher("/default.jsp").forward(request, response);
	}

}

UserFilter.java源代码:

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;

/**
 * Servlet Filter implementation class LoginFilter1
 */
@WebFilter(filterName="UserFilter",urlPatterns={"/user/*"})
public class UserFilter implements Filter {

    /**
     * Default constructor. 
     */
    public UserFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
        //1得到session
		HttpServletRequest req = (HttpServletRequest)request;
		String name = (String)req.getSession().getAttribute("admin");
		//2判断session域中是否存在admin,如果存在,放行
		//3判断session域中是否存在username。如果存在,放行,否则重定向到login1.jsp
		if(name!=null){
			chain.doFilter(request, response);
			return;
		}

		name = (String)req.getSession().getAttribute("username");
		if(name!=null){
			chain.doFilter(request, response);
		}else {
			req.setAttribute("info", "你是游客!");
			req.getRequestDispatcher("/login1.jsp").forward(request, response);
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

AdminFilter.java源代码:

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;

/**
 * Servlet Filter implementation class FilterDemo
 */
@WebFilter(filterName="AdminFilter",urlPatterns={"/admin/*"})
public class AdminFilter implements Filter {

    /**
     * Default constructor. 
     */
    public AdminFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		 //1得到session
		HttpServletRequest req = (HttpServletRequest)request;
		String name = (String)req.getSession().getAttribute("admin");
		//2判断session域中是否存在admin,如果存在,放行
		//3判断session域中是否存在username。如果存在,放行,否则打会到login1.jsp
		if(name!=null){
			chain.doFilter(request, response);
		}else {
			req.setAttribute("info", "你是会员!");
			req.getRequestDispatcher("/login1.jsp").forward(request, response);
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

login1.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入JSTL标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 导入JSTL函数库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!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>
</head>
<body>
      <h1>登录</h1>
      ${info}
      <form action="<c:url value=‘/LoginServlet1‘ />" method="post">
           用户名:<input type="text" name="username" />
           <input type="submit" value="登录" />
      </form>
</body>
</html>

default.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入JSTL标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 导入JSTL函数库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!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>
</head>
<body>
    <h1>欢迎游客!</h1>
    <a href="<c:url value=‘/default.jsp‘ />">游客入口</a>
    <a href="<c:url value=‘/user/user.jsp‘ />">会员入口</a>
    <a href="<c:url value=‘/admin/admin.jsp‘ />">管理员入口</a>
</body>
</html>

admin.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入JSTL标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 导入JSTL函数库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!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>
</head>
<body>
     <h1>欢迎管理员!</h1>
     <a href="<c:url value=‘/default.jsp‘ />">游客入口</a>
     <a href="<c:url value=‘/user/user.jsp‘ />">会员入口</a>
     <a href="<c:url value=‘/admin/admin.jsp‘ />">管理员入口</a>
</body>
</html>

user.jap:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入JSTL标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 导入JSTL函数库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!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>
</head>
<body>
      <h1>欢迎会员!</h1>
      <a href="<c:url value=‘/default.jsp‘ />">游客入口</a>
      <a href="<c:url value=‘/user/user.jsp‘ />">会员入口</a>
      <a href="<c:url value=‘/admin/admin.jsp‘ />">管理员入口</a>
</body>
</html>

结果:

我们从default.jsp页面开始测试:只能点击游客入口,不能进入会员和管理员入口

点击会员入口,我们输入用户名:这一次我们进不去管理员入口,能进入游客和会员入口

点击管理员入口,我们输入管理员账户:三个入口都可以进去。

时间: 2024-10-10 02:36:19

Java Web学习(35):Filter学习(二)的相关文章

java web (j2ee)学习路线 —— 将青春交给命运

RESON TO DO JAVA WEB:1.JAVA WEB(企业级)  2.Android和iOS过于火爆并且不兼容 一.JAVA WEB开发需要的知识储备 1.      基本的网页设计语言:HTML.JavaScript.CSS 2.      制作动态网站:Java.JSP(servelt) 3.      数据库:MySQL.SQL Server.SQL Lite.Access.Oracle 4.      流行的框架:MVC思想和原理——了解Struts.Spring.Hibern

【java web】过滤器filter

一.过滤器简介 过滤器filter依赖于servlet容器 所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求, 这一点,是拦截器无法做到的.在Java Web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或 者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts

Java Web开发入门之Servlet(二)

简介 我也苦恼自己的博客书写格式很烂,标题+代码格式.因为每天课程量比较大,没时间花在书写格式上面,如看不习惯请多多见谅.我坚持每天书写博客主要是养成一个习惯,并一直延续下去,虽然内容很空泛,目的也算达到了,总之为了巩固知识点,坚持不懈 Servlet快速入门 0. Servlet简介 什么是servlet 它其实就是java类,运行在服务器端,主要用途就是处理用户发送HTTP请求,并且作出响应 学习两个包:javax.servlet/javax.servlet.http Servlet容器就是

Myeclipse 搭建Java Web 项目:Servlet 《二》

上一节,我们使用myeclipse部署了web项目,但那部署的为静态的web项目,下面我们来学习编写动态的web项目,编写动态项目必须要用到的为:servlet. Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小程序. 编写一个现实登陆的Servlet,并部署访问. 1.编写登录的jsp页面,采用post方式提交. 访问此JSP页面: 2.编写LoginServlet 来通过后台校验登录的用户

Java Web Servlet知识点讲解(二)

一.定义Servlet: public class HelloServlet extends HttpServlet { @Override  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("get method invoke"); PrintWriter ou

Java web 实现 之 Filter分析ip统计网站的访问次数

统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的. 用什么东西来装载统计的数据.Map<String,Integer> 整个网站只需要一个Map即可! Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Map保存到ServletContext中!!!) Map需要在Filter中用来保存数据 Map需要在页面使用,

Java web图片验证功能实现二

上一篇实现的是最简单的图片验证,本文要实现复杂一点的:图片是旋转的,并通过一个注册实例把图片验证嵌套在网页中 实现图片旋转功能的代码为: //写字母 String content = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxyz1234567890"; Random random = new Random(); Graphics2D graphics2D = (Graphics2D)graphics; //设置字体颜色 gr

Java Web学习(3):Win7 64位操作系统搭建Java Web开发环境

一搭建Java Web开发环境的总体概览 工欲善其事必先利其器.学会搭建Java Web开发环境是学习JSP动态网站开发的最基本技能之一.主要介绍在 Windows 7 64位操作系统下搭建Java Web开发环境的过程,主要包括JDK的安装与配置.Tomcat的安装与配置. Eclipse IDE for Java EE Developers的安装与配置. 在这里推荐使用的: 1)Java  JDK 8.0 2)Server   Tomcat 8.0 3)IDE   Eclipse IDE f

Java web开发路线--Java学习资料汇总

Java web开发是什么? 先来说说java体系,包含:javaSE.javaEE.javaME,其实目前关注主要是javaEE,但学些javaEE必须先学习javaSE(因为这个是java基础).Java web开发其实是应用javaEE实现web应用的开发,是用Java技术来解决相关web互联网领域的技术总和. web开发主要包括前端开发和后端开发,前端主要是HTML.CSS.JS等相关技术,后端技术主要有JavaEE技术.数据库技术.文件存储技术等.java体系比较庞大,也是很多人比较迷

Java Web开发中MVC设计模式简介

一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里. Java是一门应用设计模式比较广泛的语言.目前主流提出的23种设计模式均可在Java语言编写的程序中所应用.目前