在我使用Spring MVC框架编写web的登录的时候,思路有些不清楚,练习和思考后画出了自己的思考图,这篇笔记是我对登陆流程的思考:
想实现:1.对除登录页面外所有的请求配置登陆拦截
2.登录请求通过/login Controller的方法
一. 对请求分类
在图中我把浏览器所有的请求按照是否与登录相关分为了三种
1. 对/login路径的请求
在网站内的**已登陆用户**可以进入/login来切换账号
在网站外的**未登录用户**进入/login来登录
2. 对/login.html静态页面的请求
**已/未登录用户**请求/login.html
3. 对其他的所有资源的请求
**已/未登录用户**请求网页登录外的资源
二. 对登录拦截器中的配置
按照对请求的分类,在Interceptor的配置文件中对/login和/login.html两个路径区分出来,不对这两个路径进行登陆拦截
/*web.xml文件中对.html静态文件放行,不过DispatcherServlet*/
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
/*mvc.xml文件中对/login路径放行*/
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<bean class="com.gasin.rbac.web.interceptor.LoginInterceptor"/>
</mvc:interceptor>
三. 对不同请求的处理
- LoginController处理/login路径的请求
/login路径的请求可以是已登陆的用户切换账号,或者是未登录用户进入页面登录,它们是不带登录参数的,所以可以把这两个请求通过有无登录参数来区分出来。
1. 没有登陆参数的,把请求转发到login.html页面去登录
2. 有登陆参数,就是login.html发过来的登录请求,应该验证登陆
@RequestMapping("login")
@ResponseBody
public JSONResult login( HttpServletResponse response, User user) {
//1.判断是否为登录请求
if (user.getName() == null) {
//2.1对登陆页面的请求
response.sendRedirect("/static/login.html");
return null;
} else {
//2.2请求登录
return userService.checkAUserByNameAndPsd(user) ? new JSONResult(true, "登陸成功")
: new JSONResult(false, "登陸失敗");
}
}
-
处理对/login.html静态页面的请求
-
已/未登录用户请求/login.html,在登录拦截器中直接放行
-
之前觉得静态页面不可以做回显,学习到可以用Ajax请求回显数据对已登陆的用户进行账号信息回显。在login.html中编写:
-
$(function () {
/*Ajax请求从后台Session中拿登陆信息数据*/
$.post("/getname", function (result) {
if (result.success) {
var a = JSON.parse(result.msg);
$("#name").val(a.name);
$("#password").val(a.password);
}
});
});
-
登录拦截器中处理对其他的所有资源的请求
已/未登录用户请求网页登录外的资源,在拦截器preHandle方法中进行登录判断
已登陆用户放行,未登录用户转发到login.html页面
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
Object userInSession = request.getSession().getAttribute("USER_IN_SESSION");
if (userInSession != null)
return true;
else {
response.sendRedirect("/login.html");
return false;
}
}
over
by wangyk