版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nba_linshuhao/article/details/82913445
开发环境:Idea2018.2+maven3.5.4
实现效果:
进行增删改查页面只有登陆才能进行操作,登录和注册页面不拦截,被拦截之后自动转到登录页面
一、在springmvc.xml中配置拦截器
<!-- 配置用于session验证的拦截器 -->
<mvc:interceptors>
<bean class="com.ssm.interceptor.LoginInterceptor"></bean>
</mvc:interceptors>
二、自己定义一个拦截器类LoginInterceptor.java
package com.ssm.interceptor;
import com.ssm.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* return false表示拦截,不向下执行
* return true表示放行,不拦截
*/
public class LoginInterceptor implements HandlerInterceptor {
//首先会执行的方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// boolean flag = false;
//获取请求资源
String requestURI = request.getRequestURI();
//指定不拦截的路径
final String[] IGNORE_URI = {"/user/register","/user/login", "/user/registerjump","/user/loginjump" };
//指定拦截的路径,需要登录才可以进入的页面
final String[] PRE_UNIGNORE_URI = {
"/user/toAddUser","/user/addUser","/user/getAllUser",
"/user/toUpdate","/user/updateUser", "/user/delUser","/user/list"
};
//jsp获得当前页面名称 sunString:截取一部分 requestURI.lastIndexOf:表示从uri的最后一个/开始截取
//比如uri是"C:/abc/edf/123.txt" ,结果就是/123 截取最后一个/和.之间的部分
String uri = requestURI.substring(requestURI.lastIndexOf("/"));
//这部分url是特定的,不拦截。 return true表示放行
if (uri.startsWith("/user/registerjump") || uri.startsWith("/user/loginjump") || uri.startsWith("/user/register")|| uri.startsWith("/user/login")) {
return true;
}
//从session中获取对象
User user = (User) request.getSession().getAttribute("user");
//执行循环,依次取出要拦截的字段,如果请求的url中包含该字段,flag=true
for (String preURI : PRE_UNIGNORE_URI) {
if (requestURI.contains(preURI)) {
// flag = true;
if(user!=null){
return true;
}else{
String loginUrl = "/user/loginjump";
response.sendRedirect(request.getContextPath() + loginUrl);
}
}
}
// //有个页面要拦截,判断一下用户是否已经登录: 登录就放行,未登录就拦截
// if (flag==true) { //flag为真,表示是拦截的字段,并且session中没有这个用户,就重定向到登录页面
return true;
}
//返回ModelAndView之前执行的方法,面向切面编程中的体现,已经进入了controller
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// System.out.println("进入了postHandle。。。。。。");
}
//执行Handle完成之后执行的方法
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// System.out.println("进入了afterHandle。。。。。。");
}
}
三、在Controller类的登录控制器方法中,把登录之后的user对象保存在session中,因为在拦截器类中要判断是否登录。主要代码如下:
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private HttpServletRequest request; //自动注入request
@Autowired
private IUserService userService;
/**
* 登录验证,登录成功跳转到用户信息页面
* @param name
* @param password
* @param model
* @return
*/
@RequestMapping("login")
public String login(@Param("name")String name, @Param("password")String password, Model model) {
User user=userService.checkByName(name);
if(name==null||"".equals(name)){ //没有输入姓名
model.addAttribute("msg1","请输入姓名");
}else if(user==null||"".trim().equals(user)){ //输入姓名但是姓名错误
model.addAttribute("msg1","账户不存在,请先注册");
return "login";
}else if(user!=null &(password==null||"".equals(password))){ //姓名正确,但没有输入密码
model.addAttribute("msg2","请输入密码");
}else if(user!=null &!(user.getPassword().equals(password))) { //姓名正确,输入密码,但是密码错误
model.addAttribute("msg2","密码错误");
}else if (user!=null &user.getPassword().equals(password)){ //姓名密码均正确
// return "redirect:/user/getAllUser";
HttpSession session = request.getSession();
session.setAttribute("user",user);
return "redirect:/user/list";
}
return "login";
}