目录
##SpringMVC怎么和AJAX相互调用的?SpringMVC是如何交互的
#SpringMVC的工作流程(各个组件的作用)——面试问了
#在SpringMVC中拦截器的使用步骤是什么样的?(必会)
常用注解
接收前端的参数
@ResponseBody——将数据转化为"JSON字符串"返回,如果是字符串,则将字符串返回---响应**
@RequestBody——JSON串转化为User(接受前端请求数据时)——-请求**接收参数
@RestController//=@Controller+@ResponseBody:让控制层 类的所有方法的返回值都是JSON串
@RequestMapping("/hello")//---请求** "/hello"是请求路径 支持任意类型的的请求 业务名
例:URL地址:http://localhost:8080/findUserByNA?name=jack&age=18
@RequestMapping("/findUserByNA")
以后都不用这个注解,使用了Vue.js后用下面四个 中的一个:可以直接指定请求方式
@PostMapping("/···")//---请求类型**
URL:"http://localhost:8080/axios/saveUser"
@GetMapping("/···")
@PutMapping("/···")
@DeleteMapping("/···")
@PathVariable——请求方式为restFul风格时参数接收时采用@PathVariable取值 或者封装成对象
#什么是SpringMVC框架?
控制层框架,主要负责实现前后端数据的 交互
##SpringMVC怎么和AJAX相互调用的?SpringMVC是如何交互的
1. 前端浏览器通过http请求可以携带参数访问后端服务器--ajax请求方式/. 请求(比如用户输入用户名和密码登录)
2. 后端服务器可以将结果通过响应 以JSON字符串形式交还给前端—servlet机制/. 响应(提示用户 用户登陆成功)
#SpringMVC的工作流程(各个组件的作用)——面试问了
1.用户发送请求到前端控制器(DispatcherServlet)
2.前端控制器(DispatcherServlet)收到请求 用处理器映射器(HandlerMapping),去查找处理请求的处理器(Handler)
3.处理器映射器(HandlerMapping)找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成) 一并返回给前端控制器DispatcherServlet。
4.前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)
5.处理器适配器(HandlerAdapter)去调用自定义的处理器类(Controller,也叫后端控制器)。
6.自定义的处理器类(Controller,也叫后端控制器)将得到的参数进行处理并返回结果给处理器适配器(HandlerAdapter)
7.处理器适配器(HandlerAdapter)将得到的结果返回给前端控制器(DispatcherServlet)
8.前端控制器 (DispatcherServlet)将ModelAndView传给视图解析器(ViewReslover),。
9.视图解析器(ViewReslover)将得到的参数从逻辑视图转化为真正的物理视图View对象并返回给前端控制器(DispatcherServlet)
10.前端控制器(DispatcherServlet)调用物理视图进行渲染并将渲染后的结果返回给用户
#Ajax
##概念
AJAX 特点:局部刷新,异步访问
局部刷新 网页,是一种在无需重新加载整个网页的情况下,能够更新局部网页的技术。
异步访问,提高网页的动态性和响应速度:第一处加载不出来,不会停止对后面的第二、三处内容加载
Ajax功能作用:主要实现前后端交互,提高用户界面与服务器之间的交互效率
最大的缺点是:不支持跨域
##Ajax为什么可以实现异步访问?异步原理/工作流程:
异步的原因在于两点:1、由引擎直接请求后台服务器,和用户没有关系 2、用户在请求的时间段内可以做自己的事情
1、用户直接访问服务器(没有Ajax时):当用户直接访问后台服务器时只能是同步请求,SpringMVC接收用户的参数并给用户响应;但是当后台服务器处于忙碌状态时,就无法及时处理用户的请求,无法给用户响应,用户页面上显示的就一直是正在加载 转圈,需要一直处于等待页面——这种等待会有两种结果:要么是SpringMVC不忙碌了,正常响应;要么是等待时间超时了,用户出现了504异常,自动断开用户和服务器端的连接
2、用户通过Ajax访问服务器(用户和后端服务器之间多了一个Ajax引擎 来代理):当用户发出请求后,不再直接访问后台服务器,而是将请求发给了Ajax引擎,然后由引擎向后台服务器发送请求;然后SpringMVC开始响应,先响应给引擎,引擎响应给用户,引擎有一种回调函数机制来通知用户,在回调函数未被触发时用户可以做自己的事情,不必一直等待
##跨域-面试
###什么是跨域
1. 浏览器的网址与Ajax请求网址必须满足同源策略.则浏览器才能解析Ajax,执行正确的请求.
2. 必须满足 协议/域名/端口号都相同时.表示满足同源策略.如果满足同源策略,则称之为 “同域访问” 反之称之为 “跨域访问” 跨域访问浏览器一般都会报错
###跨域解决方案(面试问)
1.jsonp 方式跨域 现在淘汰了.
2.CORS 跨域资源共享——面试:简述什么是CORS
跨源资源共享 (CORS) 是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),
这样浏览器可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器
发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头。
总结: CORS要求在服务器端标识哪个网址可以跨域访问我 加一个注解@CrossOrigin允许跨域访问,没有限定,谁都可以访问
如果想要限定@CrossOrigin(value = "http://baidu.com")只允许百度访问
###跨域问题常见笔试题
跨域问题
同源策略:
1. 浏览器URL中的地址 例子:http://localhost:8848/webDemo/demo/3-axios.html
2. Ajax请求的URL地址 例子: http://localhost:8080/web/hello
要求: 上述要素必须满足 协议/域名/端口号都相同时.表示满足同源策略.
**如果满足同源策略,则称之为 “同域访问” 反之称之为 “跨域访问” 跨域访问浏览器一般都会报错 **
跨域的判断:协议 域名 端口 三个点来依次看 规定要求:请求协议://域名:端口号
案例1:
浏览器地址: http://localhost:8080/xx/xxx
Ajax地址: https://localhost:8080/yy/yyyy 跨域请求:协议不同
案例2:
前提: 域名与IP地址对应
浏览器地址: http://www.jt.com:8080/xx/xxx
Ajax地址: http://10.4.5.2:8080/yy/yyyy 跨域请求:域名不同
案例3:
浏览器地址: http://www.jt.com/xx/xxx
Ajax地址: http://www.jt.com:80/yy/yyyy 同域请求:http协议端口号默认80 不写时默认80
案例4:
浏览器地址: https://www.jt.com/xx/xxx
Ajax地址: https://www.jt.com:443/yy/yyyy 同域请求: https协议默认443端口 不写时默认443
案例5:
迷惑: IP表示同一个网段
浏览器地址: http://192.168.10.2:80/xx/xxx
Ajax地址: http://192.168.11.2:80/yy/yy 跨域请求: 域名不匹配
#JSON
##概念
JSON 是一种轻量级的数据交换格式,本质上就是一个字符串
##格式
二、JSON的格式:(面试笔试题:以下是JSON字符串的是)
1、格式一——对象格式(K-V):其中的""号key可写可不写,但最好写上
{"id": "100","name": "tomcat", "age": "18"}
2、格式二——数组格式(只有V):
[100,"张三",true]
3、格式三——嵌套格式: (数组里的V可以嵌套对象,对象里的V可以接着套数组)
[100,true,["a","b",{"name":"张三","hobbys": ["吃饭","睡觉"]}]]
格式检查:自己写完一个长的JSON后,如何确定格式对不对-json.cn网站,将自己写的JSON粘进去,有错误就会提示
##json对象和json字符串的区别
#RESTful
#在SpringMVC中, 如果想通过转发将数据传递到前台,有几种写法
方式一:直接使用request域进行数据的传递
request.setAttirbuate("name", value);
方式二:使用Model进行传值,底层会将数据放入request域进行数据的传递
model.addAttribuate("name", value);
方式三:使用ModelMap进行传值,底层会将数据放入request域进行数据的传递
modelmap.put("name",value);
方式四:借用ModelAndView在其中设置数据和视图
mv.addObject("name",value);
mv.setView("success");
return mv;
SpringMVC 中如何解决GET|POST请求中文乱码问题?(了解)
SpringMVC 中如何解决GET|POST请求中文乱码问题?(了解)
(1)解决post请求乱码问题:在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
get请求中文参数出现乱码解决方法有两个:
①修改tomcat配置文件添加编码与工程编码一致,如下:
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
②另外一种方法对参数进行重新编码:
String userName= new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
#在SpringMVC中拦截器的使用步骤是什么样的?(必会)
在SpringMVC中拦截器的使用步骤是什么样的?(必会) 等同于sentinel限流的原理
1 定义拦截器类:
创建一个类 实现SpringMVC为我们提供的拦截器规范的接口HandlerInterceptor ,重写接口中的抽象方法;
preHandle方法:在调用处理器之前调用该方法,如果该方法返回true则请求继续向下进行,否则请求不会继续向下进行,处理器也不会调用
postHandle方法:在调用处理器之后调用该方法
afterCompletion方法:在前端控制器渲染完成之后调用此方法
2 注册拦截器:
在SpringMVC核心配置文件中注册自定义的拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="拦截路径规则"/>
<mvc:exclude-mapping path="不拦截路径规则"/>
<bean class="自定义拦截器的类全限定名"/>
</mvc:interceptor>
</mvc:interceptors>
https://blog.csdn.net/maitian_2008/article/details/122496655?spm=1001.2014.3001.5501#t26
此处是 设置了一个拦截器,拦截了不在规定时间8-18的操作,如果不是在规定时间8-18,将拦截所有操作
其他拦截器使用:写个拦截器判定是不是会员,会员才能进行某些操作
面试题:自己想的 拦截器的多个使用场景