day02 用户登录与退出,拦截器

查看文档需求,思考+设计+写代码

中央调度器

请求调度器是一个servlet
前端发送过来请求需要经过中央调度器来进行分配和调度,中央调度器只会调用请求路径与之url路径匹配的请求路径。
处理器映射器则是根据请求的URL路径找到对应的处理器(即Controller)来处理请求。
处理器适配器会调用可适配的处理器(Controller),并将请求包装成HandlerInvocation对象进行处理。HandlerInvocation对象包含了请求、响应、处理器等信息,它将请求和处理器解耦,使得处理器只需要关心如何处理请求,而不必关心请求如何传递、处理结果如何返回等问题。
在这里插入图片描述
这里配置了/,意思是处理所有来自客户端的请求,包括所有的URL地址。
使得Tomcat的默认Servlet无法处理静态资源,因为所有的请求都会被中央调度器拦截并处理,而不论请求的是动态资源还是静态资源。
为了能使静态资源被控制器对象处理,需要在applicationContext-dispatcher ,也就是springmvc配置文件中加入标签<mvc:default-servlet-handler /><!--静态资源释放--> <!--解析ajax请求的注解驱动--> <mvc:annotation-driven/>详解点此

在这里插入图片描述
中央调度器处理具体流程

处理进入登录页面

因为中央调度器拦截了所有的请求,因此我们需要用Controller来转发请求,从首页跳转到登录页面
@Controller 注解 applicationContext-dispatcher中扫描,将bean对象放入spring容器中管理
@RequestMapping(“/”) 中央调度器的请求路径与之匹配,走public String index()方法

Controller对象职责
接收参数,封装参数–>无参数
调用Service方法->无调用
响应信息到浏览器->跳转页面,配合在apllicationContext-dispatcher中的视图解析器IRVR,因此为String类型的返回值

Controller类中的方法必须是public的访问权限,因为最后是dispatcherServlet也就是中央调度器调用方法的,dispatcherServlet和Controller不是一个包的,也没有继承关系,所有必须是public方法。
在这里插入图片描述
美工给我们的是.html静态页面,我们需要改成.jsp动态页面。

注意idea对html和jsp网页的默认编码方式不一样的,idea对html默认是iso8859-1,对jsp是utf-8
中文在iso8859-1和utf-8中是不一样的,于是将html网页的编码设置成utf-8再转换为jsp
在html的网页第一行添加编码格式,jsp的编码模式<%page contenType="charset="text/html;charset=UTF-8" language="java" %>
在这里插入图片描述

处理进入工作区页面

用户登录,页面跳转及验证

在这里插入图片描述
细节:
从底层开始:
mapper–service–controller–客户端
1、查询不需要判断异常,只需要判断查询出的数据是否为空。但增删改需要判断异常。
2、判断是否用户过期,需要同当前时间和数据库中的时间进行比对。数据库的时间格式不固定,可能会修改,我们需要让当前时间和数据库的时间格式相同,通过字符串的形式进行比对.compareTo
格式相同,定义公共类TimeUtils,将当前时间转为与数据库格式相同的字符串形式。

跨模块使用的类放到公共的包下,公共的包下有公共的类。公共类也有分类。公共的实体类,工具类,常量类。

SimpleDateFormate sdf = new SimpleDateFormate("yyyy-MM-dd HH:mm:ss");
String str = sdf.formate(date);

3、免登录:将用户名和密码新建cookie,存入硬盘cookie,设置最大时间setMaxAge,过期则cokkie自动删除数据,前端页面通过jstl语句<c:if test="${}" >判断是否勾选上,来写不同的状态,通过获取${cookie.key.value}来自动填充
在这里插入图片描述
在这里插入图片描述
session通过HttpRequestServlet进行读取和存入
cookie 通过HttpResponseServlet进行读取和存入
注意:当cookie的key值和另一个新建的cookie的key值相同时,旧cookie值会被覆盖成新cookie。

把控制层的数据传递给视图层

1、ajax @ResponseBody
2、作用域
pageContext:页面范围之内传递数据,不同标签之间传递数据。jstl中的标签底层对应的都有一个java类。
request:从发起请求开始到响应请求结束。(一次请求中传递数据)
session:一次会话。在同一个浏览器窗口中,不同请求之间传递数据。
application:所有用户长久频繁使用的共享数据。
作用域中的数据在jsp中取数据需要用el表达式,${对象名}

${}默认从域中取数据,先从pageContext走,再从request走,再走session,最后走application,为了提高效率我们直接定义从session中走。
${作用域.key} ${sessionScope.sessionUser.name}

4、实现回车登录

$(window).keydown(function(e){
	if(e.keyCode==13){
		$("loginBtn").click();	
	}
})

5、前端回车或者点击登录按钮时,
收集参数

var loginAct=$.trim($("#loginAct").val());
var loginPwd=$.trim($("#loginPwd").val());
var isRemPwd=$("#isRemPwd").prop("checked");

表单验证 alert,return
为了让用户不着急,在提示信息位置,在ajax响应之前,提示正在努力验证的字眼$("#id").html("正在努力验证")

响应ajax

$.ajax({
url:'',
data:{},
type:'',
dataType:'',
success:function(data){}
})

<button type="button" id="loginBtn" class="btn btn-primary btn-lg btn-block" style="width: 350px; position: relative;top: 45px;">登录</button> 异步请求,type=button,同步type=submit

同步请求和异步请求的区别:

同步请求:浏览器窗口发出的请求,响应信息返回到浏览器窗口,所以会进行全局刷新。
异步请求:ajax发出的请求,响应信息返回到ajax的回调函数,既可以进行全局刷新,也可以进行局部刷新。

用户安全退出

同步刷新。
删除session session.invalidate()
销毁cookie cookie.setMaxAge(0);reponse.addCookie(cookie);
用户安全退出的Controller与需要跳转的页面的路径不同,因此需要使用重定向return "redirect:/";

拦截所有的用户请求 拦截器

根据文档,用户访问任何业务资源,都需要进行登录验证
也就是拦截用户的所有请求看是否已经登录,登录的人cookie有值,没有登录的,cokkie没值或者查看session,只有登录成功的人才有session。
1、提供拦截器类继承HandlerInterceptor接口实现他的三个方法preHandler,postHandle,afterCompletion
在这里插入图片描述
框架对拦截器进行了封装,我们需要在applicationContext-dispatcher 中配置拦截器
拦截的是业务资源,也就是访问Controller的请求,我们写Conytroller的requestMapping的时候是和页面资源路径对应打钩的
/*代表一层任意的子目录
/**代表多层的子目录
注意1、不能拦截登录页面,否则会造成死循环2、不能拦截登录验证的页面,此时也没有登录成功。排除拦截请求的优先级高
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值