我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JSP(4)----servlet编程3

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JSP(4)----servlet编程3

Servlet过滤器

由Servlet容器管理的对象,过滤器的功能是在原数据和目的数据之间起过滤作用的中间组件。


简单实例实现:

过滤器功能:在访问指定资源之前,打印一条日志,访问指定资源之后,打印一条日志


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



public class FilterOne implements Filter {

    
    public FilterOne() {
        System.out.println("=======构造函数==========");
    }

    
	public void init(FilterConfig fConfig) throws ServletException {
		//Servlet启动时执行init方法,
		// 这点和Servlet是有区别的
		// servlet在第一次被访问是执行init方法,过滤器在容器启动时执行init方法
		System.out.println("=======初始化=========");
		String initParam = fConfig.getInitParameter("param");
		System.out.println("param=" + initParam);
	}

	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("=======开始doFilter=========");
		chain.doFilter(request, response);
		System.out.println("=======结束doFilter=========");
	}

	
	public void destroy() {
		System.out.println("======销毁=========");
	}

}


在web.xml中添加:

<filter>
  	<filter-name>FilterOne</filter-name>
  	<filter-class>com.jike.filter.FilterOne</filter-class>
  	<init-param>
  		<param-name>param</param-name>
  		<param-value>thystar</param-value>
  	</init-param>
  </filter>
  
  <filter-mapping>
  	<filter-name>FilterOne</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

访问:http://localhost:8080/JSPStudy/Hello


过滤器的应用范围:

权限控制

日志记录

图像转换

数据压缩





过滤器链:

过滤器链的执行顺序根据部署描述符中的顺序。

在上个程序的基础上再添加一个FilterTwo,代码相同。配置web.xml ,在控制栏查看运行结果。






使用过滤器进行权限校验:

处理流程:

wKioL1V-_9bzwzfsAACatD_7uew877.jpg

首先,建立jsp文件:

wKiom1V-_nTSHG-eAAAml3PndTY541.jpg

index为首页,在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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="<%= request.getContextPath() %>/11/Hello.jsp" >Hello.jsp</a>

<%  //用于根据当前用户不同的登陆状态显示连接

	String flag = "";
	Object obj = session.getAttribute("flag");// 获取登陆状态
	
	if(obj != null){
		flag = obj.toString();
	}
	if(flag.equals("login_success")){// 如果登陆
	
 %>
 	<a href="<%= request.getContextPath()%>/LogoutServlet">退出</a>
 <%}else{ // 如果未登录
 %>
 
 	<a href="<%= request.getContextPath()%>/11/login.jsp">登陆</a>
 <%
 }	
 %>
</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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 使用css美化当前页面 -->
<style type="text/css">
body{
	color: #000;
	font-size: 14px;
	margin: 20px auto;
}
</style>
<script type="text/javascript">
	function check(form){
		if(document.forms.loginForm.uname.value==""){
			alert("请输入用户名");
			document.forms.loginForm.uname.focus();
			return false;
		}
		
		if(document.forms.loginForm.upwd.value==""){
			alert("请输入密码");
			document.forms.loginForm.upwd.focus();
			return false;
		}
	}
</script>

<title>Insert title here</title>
</head>
<body>
	<form action="<%= request.getContextPath() %>/LoginServlet11" name="loginForm">
		<%if(request.getAttribute("return_uri") != null){ %>
			<input type="hidden" name="return_uri" value="<%= request.getAttribute("return_uri") %>">
		<%} %>
		<table border="1" cellspacing="0" cellpadding="5" bordercolor="silver" align="center">
			<tr>
				<!-- 提示信息 -->
				<td colspan="2" align="center" bgcolor="#E8E8E8">用户登陆</td>
			</tr>
			<tr>
				<td>用户名:</td>
				<td><input type="text" name="uname" /></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="upwd" /></td>
			</tr>
			<tr>
				<td colspan="2" align="center">
					<input type="submit" name="submit" onclick="return check(this);"/>
					<input type="reset" name="reset"/>
				</td>
			</tr>
		</table>
	</form>
</body>
</html>


在Hello.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>Insert title here</title>
</head>
<body>
<%!
	String str = "Hello world";
%>
 
<%
	out.println(str);
 %>
 <br/>
 <a href="<%= request.getContextPath() %>/11/index.jsp">index.jsp</a>
</body>
</html>


此时,jsp页面设计完成。

接下来,完成登陆和退出Servlet的编写

新建Servlet:

wKioL1V_AifieS7sAACD6vgstss749.jpg

在LoginServlet11中,

package com.jike.servlet;

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

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

public class LoginServlet11 extends HttpServlet {

	public LoginServlet11() {
		super();
	}

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

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取用户提交的表单数据
		String uname = request.getParameter("uname");
		String passwd = request.getParameter("upwd");
		// returnUri用户访问登陆页之前访问的页面,通过这个值,登陆成功后的用户和以重新返回登陆前的页面
		String returnUri = request.getParameter("return_uri");

		// 输出这三个值
		System.out.println("username:" + uname);
		System.out.println("password:" + passwd);
		System.out.println("return_uri:" + returnUri);

		RequestDispatcher rd = null;
		// 非空校验
		if (uname == null || passwd == null) {
			request.setAttribute("msg", "用户名或密码为空");
			rd = request.getRequestDispatcher("/11/login.jsp");
			rd.forward(request, response);
		} else {// 否则执行登陆逻辑
			if (uname.equals("star") && passwd.equals("123")) {// 如果登陆成功
				// 则在当前用户的session对象中保存一个key为flag,值为login_success的字符串
				// 用于表面当前用户处于登陆状态
				request.getSession().setAttribute("flag", "login_success");

				// 接下来根据returnUri的值进行跳转
				if (returnUri != null) {
					rd = request.getRequestDispatcher(returnUri);
					rd.forward(request, response);
				} else {
					rd = request.getRequestDispatcher("/11/index.jsp");// 跳转回首页
					rd.forward(request, response);
				}
			} else {// 用户登陆失败
					// 在当前用户session对象中保存一个key为flag,值为login_error的字符串
					// 用于表面当前用户登陆失败
				request.getSession().setAttribute("flag", "login_error");
				request.setAttribute("msg", "用户名或密码错误");
				rd = request.getRequestDispatcher("/11/login.jsp");
				rd.forward(request, response);
			}
		}
	}

}


用于退出的LogoutServlet

package com.jike.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 LogoutServlet extends HttpServlet {

	public LogoutServlet() {
		super();
	}

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

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 直接删除session对象,跳转回首页
		request.getSession().invalidate();
		response.sendRedirect(request.getContextPath() + "/11/index.jsp");
	}

}


在web.xml中添加配置:

<servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>LoginServlet11</servlet-name>
    <servlet-class>com.jike.servlet.LoginServlet11</servlet-class>
  </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>com.jike.servlet.LogoutServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>LoginServlet11</servlet-name>
    <url-pattern>/LoginServlet11</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/LogoutServlet</url-pattern>
  </servlet-mapping>


myeclipse会自动生成这个配置



接下来,添加权限过滤器,只有登陆的客户才能访问Hello.jsp

新建过滤器:

wKioL1V_BfGyRQDmAABWrwxQJd0646.jpg


package com.jike.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
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;

public class PermissionFilter implements Filter {

	public PermissionFilter() {
		// TODO Auto-generated constructor stub
	}

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

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 强制类型转换
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		// 获取请求中的ServletPath
		String servletPath = req.getServletPath();
		// 获取session对象
		HttpSession session = req.getSession();
		// 获取session对象的flag的值,强制转换为String类型
		String flag = (String) session.getAttribute("flag");

		// 如果用户访问的是首页,或login.jsp或者执行登陆操作
		if (servletPath != null
				&& (servletPath.equals("/11/login.jsp")
						|| (servletPath.equals("/11/index.jsp")) || (servletPath
							.equals("/LoginServlet11")))) {
			chain.doFilter(request, response);// 将请求转发给下一个组件处理
		} else {// 对于请求的其他的url都会进行权限校验
				// 如果用户处于登陆状态,可以直接访问
			if (flag != null && flag.equals("login_success")) {
				chain.doFilter(request, response);
			} else if (flag != null && flag.equals("login_error")) {// 如果登陆失败
				req.setAttribute("msg", "登陆失败, 请重新登陆");
				// 把用户访问的url保存到request对象中
				req.setAttribute("return_uri", servletPath);
				RequestDispatcher rd = req
						.getRequestDispatcher("/11/login.jsp");
				rd.forward(req, resp);
			} else {// 如果没有登陆
				req.setAttribute("msg", "尚未登录");
				req.setAttribute("return_uri", servletPath);// 保存url
				RequestDispatcher rd = req
						.getRequestDispatcher("/11/login.jsp");
				rd.forward(req, resp);
			}
		}

	}

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

}


在web.xml中添加配置:

  <filter>
  	<filter-name>PermissionFilter</filter-name>
  	<filter-class>com.jike.filter.PermissionFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>PermissionFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>


访问 :http://localhost:8080/JSPStudy/index.jsp

测试



极客学院:http://www.jikexueyuan.com/course/644.html


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JSP(4)----servlet编程3

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JSP(4)----servlet编程3

Servlet过滤器由Servlet容器管理的对象,过滤器的功能是在原数据和目的数据之间起过滤作用的中间组件。简单实例实现:过滤器功能:在访问指定资源之前,打印一条日志,访问指定资源之后,打印一条日志package com.jike.fil
2023-01-31

JSP (3)------JDBC编程1

JDBC API :是一系列的编程接口,可以用来连接数据库,访问数据等。DriverManager : 驱动程序管理类,用来装载驱动程序,为创建数据库连接提供支持。Connection:用于连接某一指定的数据库Statement : 提供了
2023-01-31

Java Servlet和JSP教程(11)(转)

Java Servlet和JSP教程(11)(转)[@more@]此篇是本站CnJSP小组核心成员钝刀原创作品11 JSP 11.1 JSP概述 JavaServer Pages (JSP)使得我们能够分离页面的静态HTML和动态部分。HT
2023-06-03

jsp到servlet后台服务通信过程的示例分析

这篇文章主要介绍了jsp到servlet后台服务通信过程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。web.xml 文件对于任何一个web 运用来说,有,而且只能
2023-06-02

切面编程(3)

过滤器相对比较简单了public class WebFiler implements Filter{    //在bean销毁的时候执行@Overridepublic void destroy() {System.out.println("
2023-01-31

jsp编程软件怎么使用

JSP编程软件是一种用于开发Java Web应用程序的工具,常见的JSP编程软件有Eclipse、IntelliJ IDEA、NetBeans等。使用JSP编程软件进行开发,一般需要按照以下步骤进行:1. 安装JSP编程软件:下载并安装JS
2023-06-08

JSP编程-response.getWriter().flush();不起作用

response.getWriter().flush()方法用于将缓冲区的内容强制刷新到客户端。这意味着在调用该方法之后,所有未发送的缓冲区内容将被发送到客户端。如果在调用response.getWriter().flush()方法后仍然没
2023-09-27

Java编程语言(第4版)

Java编程语言(第4版): Detail:Java编程语言(第4版)[@more@]
2023-06-03

#4 编写第一个程序

前言前面三节为Python程序的运行打下了坚实的基础,是骡子是马拉出来遛遛,所以从这节开始,将开始正式进入Python的编程环节,唯有不忘初心,才能方得始终!一、Python交互模式编写学习任何一门语言,都要有仪式感,比如中文的第一句:叫爸
2023-01-30

linux系统编程(3)

一 线程间同步 同步:相互之间配合完成一件事情 互斥:保证访问共享资源的完整性(有你没我) POSIX 线程中同步:使用信号量实现 信号量 : 表示一类资源,它的值表示资源的个数 对资源访问: p操作(申请资源) [将资源的值 -
2023-01-31

Java编程思想(3)

第三章控制程序流但是在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方.94页
2023-01-31

Linux下C编程(3)

创建一个能用的SOCKET是非常简单的,因为GLIBC已经为你做了很多简化工作,但是从另一个角度来说,一个通用的SOCKET不代表一个高效性能的网络应用。我们前面说到sockfd其实同真正的FD是一样的。都是LINUX下的一个打开的设备描述
2023-01-31

网络编程3要素

1.找到对方ip2.找到应用程序端口3.定义相同的通信协议关于ip:127.0.0.1本地回环地址,可用于ping网卡xxx.xxx.xxx.255 广播地址,网段内的计算机都能收到关于端口:范围在0-65535关于通信协议:iso发布了o
2023-01-31

如何理解.NET 4并行编程

这期内容当中小编将会给大家带来有关如何理解.NET 4并行编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.并行编程和多线程编程的区别。1.1并行编程。现在随着多核计算机的普及,并行编程技术,也就是多
2023-06-17

多线程编程(3):线程池ThreadPo

在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在内部使用对象池来处理这种情况,以提高性能
2023-01-31

Python编程学习3:Python 对

面试遇到一个问题:如何删除一个python对象?下面将介绍python的对象引用和 del删除引用1.  首先介绍下python的对象引用1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用。即Python不允许程
2023-01-31

Java和JSP编程中常见问题有哪些

这篇文章主要为大家展示了“Java和JSP编程中常见问题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java和JSP编程中常见问题有哪些”这篇文章吧。Java是由Sun Microsys
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录