JavaEE Servlet02

目录

过滤器

功能:

作用:

代码

运行

同步异步

运行

同步

同步请求

代码

异步

异步请求

如何实现发送异步请求

1、原始方式

代码

运行

跨域问题

为什么要跨域访问

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

如何解决跨域问题:

2、用异步框架

搜索案例搭建

json数据格式

组件

代码

运行

​编辑


过滤器

javaEE中对请求和响应进行拦截的技术

定义一个类,实现Filter接口

可以让某些请求地址再到达servlet之前进入到指定过滤器中,实现统一的处理。

例如编码过滤,权限等进行统一过滤

功能:

web开发人员通过filter技术,对web服务器管理的所有web资源

作用:

● 过滤器用来实现通用的功能,减少代码冗余,提高可维护性

● 一个过滤器可以配置给多个资源使用

● 一个资源也可以配置多个过滤器,按照配置顺序调用

代码

filtrt包

java 复制代码
package com.ffyc.webserver.filter;

import javax.servlet.*;
import java.io.IOException;

/*
  设置请求和响应编码集的
*/
public class EncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
    }

    /*
      执行过滤操作的方法
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("编码过滤器");
        //设置请求编码集
        servletRequest.setCharacterEncoding("utf-8");
        //设置响应编码集
        servletResponse.setContentType("text/html;charset=utf-8");
        //让请求离开过滤器,继续向下执行,下一个可能是过滤器,也可能是目标访问的servlet
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("过滤器销毁时");
    }
}

loginSercive

java 复制代码
package com.ffyc.webserver.servlet;

import com.ffyc.webserver.dao.LoginDao;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget");
        //接收数据
        System.out.println(req.getParameter("account"));
        System.out.println(req.getParameter("password"));
        PrintWriter writer = resp.getWriter();
        writer.write("cnl");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求中我们自己提交的数据
        String account = req.getParameter("account");
        System.out.println(account);
        String password = req.getParameter("password");
        System.out.println(password);

        //dao jdbc 调用其他程序处理
        LoginDao loginDao = new LoginDao();
        //向前端响应
        PrintWriter writer = resp.getWriter();
        try {
            boolean res = loginDao.login(account,password);
            if(res){
                writer.write("登录成功!");
            }else {
                writer.write("账号或密码错误");
            }
        } catch (Exception throwables) {
            throwables.printStackTrace();
            writer.write("服务器忙,请稍后再试!");
        }
    }
}

web.xml注册

XML 复制代码
    <!--注册编码过滤器-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>com.ffyc.webserver.filter.EncodingFilter</filter-class>
    </filter>
    <!--哪些地址可以进入到编码过滤器-->
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

运行

同步异步

java 复制代码
package com.ffyc.webserver.servlet;

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 java.io.IOException;

//注解方式配置servlet
@WebServlet(urlPatterns = "/check",name = "check",loadOnStartup = 1)
public class CheckAccountServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String account = req.getParameter("account");
        if(account.equals("admin")){
            resp.getWriter().print("账号已存在");
        }else{
            resp.getWriter().print("账号未注册");
        }
    }
}

运行

同步

同时只能做一件事

同步请求

当前端向后端发送请求时,此时客户端一切操作都会停止,服务器响应回来的内容会覆盖当前网页中的内容,一次只能做一件事,与服务器交互时,其他事情就不能做了

代码

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
        <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)"/>
        <input type="password">
	</body>
</html>

输入账号直接进入后端判断无法输入密码

异步

同时做多件事

异步请求

当客户端与服务器端交互时,不影响客户端页面的其他操作,可以同时做两件事情

服务器响应回来的内容不会覆盖整个页面

现在的前后端交互都是异步的,由于页面不用覆盖,体验感更好

如何实现发送异步请求

1、原始方式

在前端用一个对象,XMLhttpRequest 发送请求 接收响应

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

跨域过滤器

java 复制代码
package com.ffyc.webserver.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
后端向前端响应时告诉前端本次响应是安全的
 */
@WebFilter(urlPatterns = "/*")
public class CorsFilter implements Filter {
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        //允许携带Cookie时不能设置为* 否则前端报错
        httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
        httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
        httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie

        filterChain.doFilter(servletRequest, servletResponse);
    }
}
运行
跨域问题

跨域访问问题

在8848访问8080后端服务

默认浏览器不允许接收来自另一个服务器响应的内容

认为响应回来的数据是来自另一个服务,可能不安全

前后端异步交互时,会出现跨域问题。

跨域问题,不同服务器间进行访问,浏览器不允许js接收来自其他服务器端响应的数据。

只要协议,域名,端口其中一个不同,都属于跨域问题

为什么要跨域访问

前后端分离开发(前端和后端在不同服务器中)

同一家公司不同项目之间要交互

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

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

如何解决跨域问题:

前端解决

CORS(跨源资源共享)

通过在服务器端设置 CORS 响应头,允许特定来源的访问。例如,设置 Access-Control-Allow-Origin 头部为允许的域名。

CORS 是最常用和推荐的方法,可以让服务器明确表示它允许哪些来源的请求。

后端解决

在响应时告知浏览器允许来自于某些指定服务响应的内容。

浏览器就认为其是安全可靠的。

2、用异步框架

axios框架

导包

html 复制代码
<!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:8080/webserver/check?account="+account).then(function(resp){
					if(resp.status==200){ 
						document.getElementById("message").innerHTML = resp.data;
					}	
                })
			}
		</script>
	</head>
	<body>
		<input type="text" name="account" onblur="checkaccount(this.value)"/><span id="message"></span><br />
		<input type="password"/>
	</body>
</html>

搜索案例搭建

前端

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/axios.min.js"></script>
		<script>
			function searchinfo(){
				var name = document.getElementById("nameid").value;
				axios.get("http://127.0.0.1:8080/webserver/search?name="+name).then((resp)=>{
					document.getElementById("box").innerHTML = resp.data;
				});
			}
		</script>
	</head>
	<body>
		<input type="text" name="name" id="nameid"/>
		<input type="button" value="查询" onclick="searchinfo()"/>
		<div id="box"></div>
	</body>
</html>

后端

java 复制代码
package com.ffyc.webserver.servlet;

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 java.io.IOException;

//注解方式配置servlet
@WebServlet(urlPatterns = "/search" ,name = "search" ,loadOnStartup = 1)
public class SearchServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("aaaaaaaaaaa");
        String name = req.getParameter("name");
        //与数据库交互查询
        String info = "张三,男,15222222";
        resp.getWriter().print(str);
    }
}

效果

json数据格式

json格式的字符串(属性:值,属性:值......)

是一种通用的数据格式 Java和js都认识,是现在前后端交互的一种标配使用方式

不同语言之间如何进行数据交换 Java 和 c 文件

json--javaScript object notation js对象表现形式

"{key:value,key:value}" "{id:10,name:"张三"}" "{{id:10,name:"张三"},{id:10,name:"张三"},{id:10,name:"张三"}}"

在后端将Java对象转为json格式的字符串

有很多的第三方组件可以将我们的Java对象转为json格式对象

组件

pro.xml

XML 复制代码
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.2</version>
        </dependency>

代码

学生类

java 复制代码
package com.ffyc.webserver.model;

public class Student {

    private int id;
    private String name;
    private String gender;
    private String phone;

    public Student() {
    }

    public Student(int id, String name, String gender, String phone) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.phone = phone;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

前端

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/axios.min.js"></script>
		<script>
			function searchinfo(){
				var name = document.getElementById("nameid").value;
				axios.get("http://127.0.0.1:8080/webserver/search?name="+name).then((resp)=>{
					var stu = resp.data;
					document.getElementById("box").innerHTML = stu.name+","+stu.gender
				});
			}
		</script>
	</head>
	<body>
		<input type="text" name="name" id="nameid"/>
		<input type="button" value="查询" onclick="searchinfo()"/>
		<div id="box"></div>
	</body>
</html>

后端

java 复制代码
package com.ffyc.webserver.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.ffyc.webserver.model.Student;
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 java.io.IOException;

//注解方式配置servlet
@WebServlet(urlPatterns = "/search" ,name = "search" ,loadOnStartup = 1)
public class SearchServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("aaaaaaaaaaa");
        String name = req.getParameter("name");
        //与数据库交互查询  将查询后的结果放在一个个对象中去
        Student student = new Student(100,"张三","男","111111111");
        String str = new ObjectMapper().writeValueAsString(student);
        System.out.println(str);
        resp.getWriter().print(str);
    }
}

运行

相关推荐
搬码红绿灯几秒前
计算机网络——交换机实验(模拟)
网络·计算机网络
不知真不只14 分钟前
网络编程之应用层协议(http)
服务器·网络·http
dr李四维16 分钟前
Java在小米SU7 Ultra汽车中的技术赋能
java·人工智能·安卓·智能驾驶·互联·小米su7ultra·hdfs架构
微臣愚钝17 分钟前
【01】HTTP基本原理
网络·网络协议·http
困觉少年17 分钟前
宝塔的ssl文件验证域名后,会在域名解析列表中留下记录吗?
网络
RainbowSea40 分钟前
130道基础OJ编程题之: 78~88
java
松树戈1 小时前
IDEA Commit 模态提交界面关闭VS开启对比
java·ide·intellij-idea
谦行1 小时前
前端视角 Java Web 入门手册 4.4:Web 开发基础—— Listener
java·后端
IvanWKQ1 小时前
本地服务重启-端口占用-显示和美国ip有个连接?存在恶意程序或是间谍程序?
linux·服务器·网络
听风吹等浪起1 小时前
计算机网络基础:VLAN(虚拟局域网)
网络·计算机网络