本文将基于提供的代码,详细解析如何实现Spring MVC的登录验证和拦截器保护机制。通过前端页面、控制器、拦截器的协同工作,确保系统资源的安全访问。
1. 核心组件说明
文件 | 功能说明 |
---|---|
LoginController.java |
处理登录请求、跳转页面的控制器 |
lanjieqi.java |
拦截器:验证用户登录状态(类名建议改为AuthInterceptor 更规范) |
User.java |
用户实体类(存储用户名密码) |
Response.java |
统一响应对象(返回状态码和消息) |
springmvc.xml |
Spring MVC核心配置(扫描包、视图解析器、拦截器注册) |
login.html |
登录页面(AJAX提交请求) |
index.html |
主页(登录成功后访问) |
2. 登录验证流程
(1) 前端请求处理 (login.html
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
用户名:<input type="text" id="name" placeholder="请输入用户名" /> <br/>
密码:<input type="text" id="password" placeholder="请输入密码" /> <br/>
<input type="button" value="登录" onclick="login()">
</body>
<script>
function login(){
var name = $("#name").val();
var password = $("#password").val();
$.ajax({
url:"/SpringMVC/login",
type:"get",
data:{
name:name,
password:password
}, success:function(data){
console.log(data)
if(data.code == 200){
window.location.href = "/SpringMVC/toIndex";
}else{
alert(data.message);
}
}
})
}
</script>
</html>
(2) 后端验证逻辑 (LoginController.java
)
package com.qcby.controller;
import com.qcby.entity.Response;
import com.qcby.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@RequestMapping("/toLogin")
public String toLogin(){
return "login";
}
@RequestMapping("/toIndex")
public String index(){
return "index";
}
@RequestMapping("/login")
@ResponseBody
public Response login(User user, HttpServletRequest request) {
if(user.getName().equals("admin") && user.getPassword().equals("123456")){
//设置session
HttpSession session = request.getSession();
session.setAttribute("loginUser",user);
return new Response("200","登录成功");
}else {
return new Response("500","登录失败");
}
}
}
3. 拦截器保护机制
(1) 拦截器核心逻辑 (lanjieqi.java
)
如何不理解拦截器请看Spring MVC拦截器深度解析:掌控请求生命周期的艺术-CSDN博客
package com.qcby.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.handler.Handler;
import java.security.PublicKey;
public class lanjieqi implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//获取当前访问的url
String url = request.getRequestURI(); //http://localhost:8080/SpringMVC/login 登录时的请求
if(!url.contains("login") && !url.contains("toLogin")){ //非登录时的请求
if(request.getSession().getAttribute("loginUser")!=null){ //说明已经登录过
return true;
}else {
//要求其进行登录
response.sendRedirect("/SpringMVC/toLogin"); //重定向到登录页面
}
}else { //登录时的请求
return true; //放行
}
return false;
}
}
(2) 拦截器配置 (springmvc.xml
)
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/toIndex"/> <!-- 拦截主页请求 -->
<bean class="com.qcby.interceptor.lanjieqi"/>
</mvc:interceptor>
</mvc:interceptors>
4. 完整交互流程
用户访问主页
http://localhost:8080/toIndex
→ 拦截器检测未登录 → 重定向到/toLogin
渲染登录页
控制器返回login.html
→ 用户输入凭据 → AJAX提交到/login
服务端验证
成功:存储Session → 返回
{code:200}
→ 前端跳转主页失败:返回
{code:500}
→ 前端弹窗提示
访问受保护资源
再次访问/toIndex
→ 拦截器检测Session存在 → 放行并展示index.html
5. 总结
通过本文实现的登录系统,我们掌握了:
使用Session管理用户登录状态
拦截器实现路由级别的权限控制
AJAX与后端RESTful风格的交互
Spring MVC的配置与组件协同
关键设计思想:
“前端轻量化请求,后端无状态验证,拦截器统一守门”
完整代码已在上文提供,建议结合实际需求扩展密码加密、多端会话管理等功能以提升安全性。