11.1 Ajax验证用户名
- 写一个 login.jsp 这个页面
<%--
Created by IntelliJ IDEA.
User: muqua
Date: 2022/7/26
Time: 19:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录验证</title>
<script src="${pageContext.request.contextPath}/static/js/jquery-3.6.0.js"></script>
</head>
<body>
<p>
用户名:<input type="text" id="name" onblur="a1()">
<br>
<span id="userInfo"></span>
</p>
<p>
密码:<input type="text" id="pwd" onblur="a2()">
<br>
<span id="pwdInfo"></span>
</p>
<script>
function a1(){
$.post({
url: "${pageContext.request.contextPath}/a3",
data: {
"name": $("#name").val()
},
success: (res) => {
if(res === 'ok'){
$("#userInfo").css("color","green");
}else{
$("#userInfo").css("color","red");
}
$("#userInfo").html(res);
}
})
}
function a2(){
$.post({
url: "${pageContext.request.contextPath}/a3",
data: {
"pwd": $("#pwd").val()
},
success: (res) => {
if(res === 'ok'){
$("#pwdInfo").css("color","green");
}else{
$("#pwdInfo").css("color","red");
}
$("#pwdInfo").html(res);
}
})
}
</script>
</body>
</html>
- 写 Controller
@RequestMapping("/a3")
public String a3(String name,String pwd){
String msg = "";
System.out.println(name + " || " + pwd);
if(name != null){
// admin 这些数据 应该在数据库中查
if("admin".equals(name)){
msg = "ok";
}else{
msg = "用户名有误";
}
}
if(pwd != null){
// admin 这些数据 应该在数据库中查
if("123".equals(pwd)){
msg = "ok";
}else{
msg = "密码有误";
}
}
return msg;
}
11.2 拦截器
SpringMVC 的处理拦截器
类似于 Servlet 开发中的 过滤器 Filter
,用于 对 处理器进行预处理和后处理。开发者 可以自己定义一些拦截器来实现 特定的功能。
过滤器和拦截器的区别:拦截器是基于AOP思想开发出来的具体应用。也就是说 它是切面编程的,不会对原有的 代码 有影响。
拦截器还有一个最大的好处:它会自动的过滤掉 jsp、html、css、image、js 等一系列资源文件,不去做 拦截的访问。而只对 Controller 方法进行拦截!!!
applicationContext.xml
中 配置 拦截器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描包,让指定包下面的注解生效,并且 由 IOC 容器 统一去管理 -->
<context:component-scan base-package="top.muquanyu.controller"></context:component-scan>
<!-- 让 Spring MVC 不处理 静态 资源 你像什么 .css .js .mp3 .mp4 啥的
不需要咱们处理,这些资源 jsp 自己就处理了。意思就是不会经过 handler 而是 直接 用这个资源文件-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--
支持 mvc 注解 的驱动
在 spring 中 一般 采用 @RequestMapping 注解来完成 映射关系
要想使 @RequestMapping 注解生效,必须向上下文中注册 DefaultAnnotationHandlerMapping
和一个 AnnotationMethodHandlerAdapter 实例
这两个 实例 分别 在 类级别 和 方法级别 上进行 处理
而 annotation-driven 这个配置 就是帮助我们 自动 配置 上面 两个实例的 bean 注入的。
-->
<mvc:annotation-driven>
<!--解决json乱码问题-->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 视图解析器 这玩意 无论咋滴,都得配置-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 拦截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**/"/> <!--待过滤的请求-->
<bean class="top.muquanyu.config.MyInterceptor"></bean> <!--用到的拦截器类-->
</mvc:interceptor>
</mvc:interceptors>
</beans>
- 写一个类 并且 实现
HandlerInterceptor
接口,就是一个拦截器了。
preHandle
:请求目标页面/Controller方法 处理前,触发拦截。
postHandle
:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
afterCompletion
:DispatcherServlet进行视图的渲染之后,多用于清理资源。
preHandle 的返回值 是 boolean 类型的,返回 true 则继续执行下一个拦截器 或 直接访问到页面。返回 false 则 卡住 不再往下执行。
package top.muquanyu.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("============处理前============");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("============处理后============");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("============进行清理============");
}
}
package top.muquanyu.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("/t1")
public String test(){
System.out.println("TestController==> test() 执行了!");
return "OK";
}
}