javaEE(2)

news2024/9/24 3:25:26

一. 过滤器

作用:拦截web服务器向后端发送的数据,使请求地址在到达servlet之前进入到指定的过滤器中,可以对数据进行一些统一的处理,比如设置编码,权限控制等

使用:创建一个类实现Filter接口,并实现里面的doFilter()方法,过滤器要做的作用主要写在doFilter方法中

public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

这是一个设置编码的过滤器,被配置的会被该过滤器拦截的servlet程序,都会在到达后端前被统一设置为utf-8编码

注意:

  1. 上述案例最后一句代码必须要写,否则程序不会继续向下执行,发出的请求将不会到达后端程序,最后一句表示将信息继续传递给下一个过滤器,如果所有过滤器都被执行,就会传递到后端
  2. 过滤器中除了有抽象方法doFilter,还有两个默认方法init()和destroy()不是必须要实现的,在需要的时候实现即可,不实现默认调父类的,父类的是空的
  3. 但是仅仅只是实现了Filter这个接口并不能使用过滤器,因为过滤器和servlet程序一样需要进行配置,我们需要对他设置哪些servlet程序会被该过滤器拦截,和servlet程序一样,有两种配置方法

1. web.xml文件中配置过滤器

    <!--
    注册过滤器,告诉服务器有这么一个过滤器
    -->
    <filter>
       <filter-name>coding</filter-name>
       <filter-class>com.ffyc.dormServer.filter.EncodingFilter</filter-class>
    </filter>

    <!--
    配置过滤器,指定哪些servlet程序会被该过滤器拦截
    /* 表示所有servlet程序都会被拦截
    /login 表示地址为/login的servlet程序会被拦截
    -->
    <filter-mapping>
        <filter-name>coding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2. 注解配置过滤器

@WebFilter(urlPatterns = "/*")
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

在类的上面加上@WebFilter注解,服务器会自动的检查该注解里面的信息,就知道该过滤器会拦截哪些servlet程序,urlPatterns表示要拦截的地址,里面还可以有很多属性,比如name表示为该过滤器起一个名字,loadonStartup默认为-1表示在第一次访问时创建servlet对象,如果将其改为0或1表示在服务器启动时就创建该servle对象

二. 同步请求与异步请求

1. 同步请求

同步:同时只能做一件事

同步请求:当前端向后端发送请求时,此时客户端的一切操作会停止,后端返回来的响应会覆盖当前网页中的内容,一次只能做一件事,与服务器交互时,客户端就不能继续进行操作了,很影响客户体验

1.1 实现同步请求

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/axios.min.js"></script>
		<script>
			function checkAccount(account){
				location.href="http://127.0.0.1:8088/webServer/check?account="+account;
		</script>
	</head>
	<body>
		账号:<input type="text" name="account" onblur="checkAccount(this.value)"/><span id="msg"></span><br/>
		密码:<input type="password">
	</body>
</html>

 当我们将输入好账号时,本来应该输入密码,但由于输入完账号,就要像后端发出请求,来验证我这个账号是否已经存在,存在就不能注册,不存在才能注册,但由于是同步请求,输入结束后,该页面就被后端的响应覆盖,导致用户无法继续操作,体验感很差

2. 异步请求

 异步:同时能做多件事

异步请求:当客户端与服务器交互时,不会影响客户端页面的操作,后端发来的响应不会覆盖整个页面

可以同时完成多件事,比如客户端的操作和向后端发送的请求处理

2.1 实现异步请求

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/axios.min.js"></script>
		<script>
			function checkAccount(account){
			   
			   // 1.创建请求对象
			   var httpobj = new XMLHttpRequest();
			   httpobj.open("get","http://127.0.0.1:8088/webServer/check?account="+account); //封装请求
			   httpobj.send(null); //发送请求 */
			   
			   // 2.执行回调函数,接收响应的结果
			      httpobj.onreadystatechange = function(){
				  document.getElementById("msg").innerHTML = httpobj.responseText;
			}
		}
		</script>
	</head>
	<body>
		账号:<input type="text" name="account" onblur="checkAccount(this.value)"/><span id="msg"></span><br/>
		密码:<input type="password">
	</body>
</html>

可以看到当我们填写完账号时,向后端发出检查的请求,后端做出响应后,客户端仍然可以进行操作,且页面内容不会被覆盖

2.2 axios框架实现异步请求

虽然上述方法成功实现了异步请求,但是写法相对麻烦,但却是最本质的,为了便于程序员书写,我们可以用axios框架实现异步请求,axios是一个http的网络请求库

2.2.1 基本的HTML文件中配置axios框架

1. 首先去官网找文档,下载axios.js文件

http://axios-js.com/

 

将上述地址复制到浏览器中,右键点击另存为下载到一个能找到的地方,然后打开HBuilder X

将其拖到你创建的普通项目的js文件夹中,然后导入到html文件中,就和之前导入vue普通项目一样

然后按照下面的代码就可以使用框架实现异步请求

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/axios.min.js"></script>
		<script>
			function checkAccount(account){
			
				  axios.get("http://127.0.0.1:8088/webServer/check?account="+account)
				  .then(function(response){
					  document.getElementById("msg").innerHTML = response.data;
					  console.log(response);
				  })
			}
		}
		</script>
	</head>
	<body>
		账号:<input type="text" name="account" onblur="checkAccount(this.value)"/><span id="msg"></span><br/>
		密码:<input type="password">
	</body>
</html>
 2.2.2 vue-cli项目中配置axios框架

1. 打开HBuilder X创建一个vue-cli项目并完成配置,打开终端输入以下指令

npm install axios

2. 在main.js中完成以下配置

2.1 导入axios

 import axios from 'axios';

2.2 设置访问后台服务器的地址

axios.defaults.baseURL="http://127.0.0.1:9999/api/";
<!--
127.0.0.1:9999这是IP和端口,是服务器的IP和端口,需要自己改
/api是访问后台哪个serlet程序的地址,这些在web.xml文件或注解中都配置过
也需要自己改
-->

注意:
127.0.0.1:9999这是IP和端口,是服务器的IP和端口,需要自己改

/api是访问后台哪个serlet程序的地址,这些在web.xml文件或注解中都配置过也需要自己改

2.3 将axios挂载到vue全局对象中,使用this可以直接访问

Vue.prototype.$http=axios;

这句话的意思是,将axios挂载到全局唯一的vue对象中,并给axios起了一个别名叫http,可以通过this.$http来访问该axios对象

这样就配置完成了,接下来使用get或post方法即可发送对应的请求,then方法中的回调函数会在请求成功或失败时触发,通过回调函数的形参可以获取响应内容,或错误信息

基本语法:

this.$http.get(地址?Key=value&key2=val1).then(function(response){ }
this.$http.post("login",{key:"value",key2:"val2"}).then(function(response){ }

 post请求的写法

 get请求也是类似的

三. 跨域问题

前后端在进行异步交互时会出现跨域问题

1. 跨域问题

不同服务器间进行访问,浏览器不允许js接收来自其他服务器响应的数据,只要协议,域名,端口其中一个不同,都属于跨域访问

2.为什么要跨域访问

1.因为一个公司会有很多业务,这些业务部署在不同的服务器中,当某个业务需要与其他业务进行交互时,就会遇到两个不同的服务器之间需要进行访问.

2.现在的项目大部分都是前后端分离的,而往往前端项目部署在一个服务器中,后端项目部署在一个服务器中,这样就能减轻服务器的压力,但是访问时就需要跨域访问了

所以我们必须要允许跨域访问的存在

3.浏览器为什么阻止跨域访问

为了安全,不能让其他服务器中的内容肆意的响应到自己的服务器中

4.如何解决跨域问题

后端:在响应时告诉浏览器允许接收来自某些指定服务响应的内容,加一个过滤器即可

前端:处理方式很多,而且跨域问题本就是前端需要考虑的问题

四. 后端响应标准格式json数据

当我们前端向后端发送一个请求,后端经过处理向前端返回一个响应,但前后端所用的语言不同,换句话说,前端无法正确识别后端返回来的信息,也就无法将其正确的输出到网页中,所以为了统一,作出了一种规定,后端向前端响应的是标准格式的json数据

json(javaScript Object Notation):javaScript对象表示法,用于交换解析文本信息的,比以前的web.xml文件更轻量级

有了json我们后端的java程序只要发送一种固定的json数据格式,这样前端就能成功识别并显示

json格式:"{键:值},{键:值}"这样的字符串

当然在后端并不需要我们自己去将结果拼接成一个这样的字符串,而是通过第三方的jar包来实现好的,我们只需要导入相应的依赖到maven中即可

json依赖:

               <!--json-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.2</version>
        </dependency>

 我们后端在处理时往往会创建一个Result类该类专门用于返回响应结果,结果包含状态码,响应内容,以及相应的对象数据

/*
登录处理的servlet程序
 */
@WebServlet(urlPatterns = "/login",name = "login",loadOnStartup = 1)
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求
        String account = req.getParameter("account");
        String password = req.getParameter("password");
        PrintWriter pw = resp.getWriter();
        Result<Admin> result = null;
        //对请求进行处理
        try {
            Admin admin = new LoginDao().login(account, password);
            if(admin!=null){
                result = new Result<>(200,"登录成功",admin);
            }else{
                result = new Result<>(201,"账号或密码错误",null);
            }
        } catch (Exception e) {
            result = new Result<>(500,"系统忙,请稍后再试!",null);
        }
        pw.write(new ObjectMapper().writeValueAsString(result));
    }
}

可以看到这是一个登陆的后端响应程序,我们将与数据库交互的结果放在一个对象中,并将该对象存在一个Result对象中,这样就能返回一个标准的json格式的响应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实训日记day24

python基础 环境部署 [root2 ~]# yum list installed|grep python python-libs.x86_64 2.7.5-68.el7 [root2 ~]# yum -y install epel-release #必须要有epel库 [root2 ~]# yum update #更新yum [root2 ~]# yum -y install net-tools [root2 ~]…

Spring Boot 多种方式更改上下文路径

1. spring boot上下文路径概述 默认情况下&#xff0c;Spring Boot 在根上下文路径&#xff08;“/”&#xff09;上提供内容。 尽管通常最好采用约定而不是配置&#xff0c;但有时我们确实希望拥有自定义路径。 在此快速教程中&#xff0c;我们将介绍配置它的不同方法。 2…

Gitlab-CI

官网 ## gitlab-ci 完整语法 https://docs.gitlab.cn/jh/ci/yaml/index.html 原理 流程图 说明 GitLab Runner 是 GitLab CI/CD 的一个组件&#xff0c;用于运行构建、测试和部署作业。它是一个开源项目&#xff0c;允许您在专用、共享或云计算资源上执行作业。 GitLab Run…

保姆级教程,一文了解LVS

目录 一.什么是LVS tips: 二.优点&#xff08;为什么要用LVS&#xff1f;&#xff09; 三.作用 四.程序组成 五.LVS 负载均衡集群的类型 六.分布式内容 六.一.分布式存储 六.二.分布式计算 六.三.分布式常见应用 tips&#xff1a; 七.LVS 涉及相关的术语 八.LVS 负…

轻舟智问大语言模型算法分析报告

一、算法全周期行为分析 1. 算法安全 信息内容安全&#xff1a;通过输入输出内容风控处理&#xff0c;确保生成的内容不涉及违法或不当信息。 信息源安全&#xff1a;模型支持用户挂载知识内容进行增强&#xff0c;确保使用高质量的知识来源。 2. 算法监测 信息安全监测&#x…

day23(mysql主从脚本与mysql详细语句介绍)

一、mysql主从脚本 在同步时&#xff0c;对删除和修改都比较慎重&#xff08;监控同步时&#xff09; mysql主从搭建 前提软件libaio&#xff0c;rsync 1.主 2.从 3.同步 4.测试 注意&#xff1a;先执行从服务器的脚本&#xff0c;再执行主服务器脚本 master-mysql配置…

Vue3+setup使用vuemap/vue-amap实现地图相关操作

首先要下载依赖并且引入 npm安装 // 安装核心库 npm install vuemap/vue-amap --save// 安装loca库 npm install vuemap/vue-amap-loca --save// 安装扩展库 npm install vuemap/vue-amap-extra --save cdn <script src"https://cdn.jsdelivr.net/npm/vuemap/vue-a…

ArcGIS基础:自定义创建点线面等样式符号以方便使用

有时&#xff0c;使用ArcGIS自带的符号样式库无法满足我们使用要求&#xff0c;还需要进行调整&#xff0c;可能会浪费一些时间&#xff0c;那么自己新建一些样式符号备用&#xff0c; 需要的时候直接使用&#xff0c;会节省很多时间&#xff0c;大家学会之后&#xff0c;对学…

ctfshow-web入门-sql注入(web196-web200)堆叠注入

目录 1、web196 2、web197 3、web198 4、web199 5、web200 1、web196 对输入长度做了限制 输出 flag 的条件&#xff1a; if($row[0]$password){$ret[msg]"登陆成功 flag is $flag";} 其中 $row[0] 表示从数据库查询结果中提取的某一行的第一个字段值&#x…

Linux网络编程5

IO多路复用 1.IO模型 在unix/linu下主要有四种I/O模式&#xff1a; 阻塞I/O: 最常用 大部分程序使用的都是阻塞模式的I/O 阻塞I/O 缺省情况下&#xff0c;套接字建立后所处于的模式就是阻塞I/O模式 读操作&#xff1a;read,recv,recvfrom 写操作&#xff1a;write,send …

【最新】推荐7款智能AI写作论文生成网站工具

在当前的AI技术浪潮中&#xff0c;智能AI写作工具已经成为了学术研究和论文撰写的重要助手。本文将推荐7款高效且功能全面的智能AI写作论文生成网站工具&#xff0c;并重点介绍其中备受好评的千笔-AIPassPaPer。 1. 千笔-AIPassPaPer 千笔-AIPassPaPer是一款集多种功能于一体…

最近在写的支付模块

最近再写支付模块就到处借鉴 旨在回顾一下。 1.确认订单功能 使用场景是&#xff1a;用户在选择好购物车后&#xff0c;或者是直接选择商品后&#xff08;选择商品封装为购物车&#xff09; 这样做是根据尚硅谷来学习的 目前需要这些属性&#xff0c;原因是在确认订单页面后…

如何采集淘宝商品评论?

采集商品评论对于企业和消费者都至关重要。它不仅帮助企业了解产品优势与不足&#xff0c;指导产品改进和市场策略调整&#xff0c;还能通过积极回应顾客反馈增强品牌忠诚度。对消费者而言&#xff0c;真实客观的评价是决策的重要参考&#xff0c;有助于避开潜在问题&#xff0…

Apache Tomcat 7下载、安装、环境变量配置 详细教程

Apache Tomcat 7下载、安装、环境变量配置 详细教程 Apache Tomcat 7下载Apache Tomcat 7 安装Apache Tomcat 7 环境变量配置启动 Apache Tomcat 7测试Tomcat7是否启动成功 Apache Tomcat 7下载 1、下载地址&#xff0c;找到Archives 链接: 官网下载地址 2、找到Tomcat 7&…

Linux查看系统线程数

Linux查看系统线程数 查看线程数查看进程内的线程统计线程数 查看线程数 想要查看Linux操作系统允许的最大线程数&#xff0c;可以通过命令 ulimit -a返回配置项的详细说明&#xff1a; # core文件的最大值为100blocks core file size (blocks, -c) 0# 进程的数…

[区间概率预测]CNN-BiLSTM-Attention-ABKDE多变量时序预测 基于改进自适应核密度估计实现区间预测

[区间概率预测]CNN-BiLSTM-Attention-ABKDE多变量时序预测 基于改进自适应核密度估计实现区间预测 【原创区间概率预测】CNN-BiLSTM-Attention-ABKDE多变量时序预测 基于卷积神经网络-双向长短期记忆神经网络-注意力机制结合自适应带宽核函数密度估计的多变量时序预测【点预测…

【51单片机仿真】基于51单片机设计的温度检测与高低温报警系统仿真源码设计文档演示视频——文末资料下载

基于51单片机设计的温度检测与高低温报警系统仿真设计 演示视频 基于51单片机设计的温度检测与高低温报警系统仿真 系统功能简介 1、实时温度测量&#xff0c;可调整温度值 2、显示测量的温度值&#xff0c;按键切换可查看高温和低温报警值 3、可通过按键输入报警最高值以及最…

8/8总结

1.三分 | 函数 虽然提示很明显了&#xff0c;但是还是没掌握套路&#xff0c;看了题解才会的&#xff0c;估计也有四分&#xff0c;就是三次方的形式。 例子&#xff1a; 2 1 2 0 0 2 2 0 0 2 -4 2AC: #include<bits/stdc.h> using namespace std; const int maxn1001…

动态规划(一)

目录 &#xff08;一&#xff09;递归到动规的一般转化方法 &#xff08;二&#xff09;动规解题的一般思路 1. 将原问题分解为子问题 2. 确定状态 3. 确定一些初始状态&#xff08;边界状态&#xff09;的值 4. 确定状态转移方程 &#xff08;三&#xff09;能用动规解…

【Android Studio】Webview 内核升级得三种方法

【Android Studio】Webview 内核升级得三种方法 前言X5 腾讯组件crosswalk开源项目webview升级加载的内核&#xff08;完美解决&#xff09;总结 前言 在APP 中进行网页加载&#xff0c;一般采用原生自带的Webview 组件&#xff0c;但在需要加载高版本网页的时候&#xff0c;有…