在上一篇博客SpringMVC框架之处理文件上传(附照片上传Demo)实现了照片上传功能,在此篇博客将实现必须登录之后才能访问页面的功能。
关于Demo源码,直接下载SpringMVC框架之处理文件上传(附照片上传Demo)尾端的源码即可,这是一个简化的Product信息展示的Demo,使用了Spring、SpringMVC、Mybatis框架。
说到拦截器
,我的想到的是Java Web
三大组件(Servlet
、Listener监听器
、Filter过滤器
)中的Filter
,而SpringMVC中拦截器
的作用与之几乎相同,用于对处理器
(处理请求)进行预处理
和后处理
。
前面的Demo,无需进行登录即可访问所有页面。
现在我们完善一下业务逻辑,只有登录过的才能访问页面资源。
本应该在数据库中新建t_user
表、新建User
实体类、对应的Mapper
、Service
、Controller
,不过为了简化逻辑,我们写死只有username="hestyle",password="123456"
的账号才能登录。
1、编写UserController
控制器
package cn.hestyle.demo.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* description: UserController控制器
*
* @author hestyle
* @version 1.0
* @className ssm_demo_01->UserController
* @date 2020-01-31 10:19
**/
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping("login.do")
public String login(String username, String password, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//SpringMVC会自动注入前端传入的username、password参数
if ("hestyle".equals(username) && "123456".equals(password)) {
//假装自己查了下数据库。。。。
HttpSession session = request.getSession();
//将登录的用户名放到session中保存
session.setAttribute("loginUser", username);
//账号名、密码正确,就重定向到/product/listAll.do
return "redirect:/product/listAll.do";
} else {
request.setAttribute("msg", "用户名或密码不正确!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return null;
}
}
}
2、编写login.jsp
控制器
<%--
Created by IntelliJ IDEA.
User: hestyle
Date: 2020/1/31
Time: 10:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.do" method="post">
<table border="1">
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
<span style="color: red">${msg}</span>
</body>
</html>
3、编写LoginInterceptor
拦截器
package cn.hestyle.demo.web.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* description: 登录拦截器
*
* @author hestyle
* @version 1.0
* @className ssm_demo_01->LoginInterceptor
* @date 2020-01-31 10:39
**/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
System.out.println("预处理....");
//如果是登录页面则放行,返回true表示放行,返回false表示拦截
if(request.getRequestURI().endsWith("login.do")){
return true;
}
HttpSession session = request.getSession();
//如果用户已登录也放行
if(session.getAttribute("loginUser") != null){
return true;
}
//用户没有登录重定向到登录页面
response.sendRedirect(request.getContextPath() + "/login.jsp");
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("未返回视图前 后处理....");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("返回视图前 后处理");
}
}
4、在SpringMVC
中配置拦截器
<!-- 6.配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.hestyle.demo.web.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
5、重新部署项目
会自动跳转到登录页面
登录账号
直接跳转到listAll界面
以上就是SpringMVC框架之拦截器(附Demo)中的主要内容,只要涉及Session
、SpringMVC
拦截器的运用。