SpringMVC登录拦截DEMO
交给/login的post请求的控制器处理, 并通过控制器的逻辑控制获取提示信息
login.jsp
<%-- Created by IntelliJ IDEA. User: shijinglu Date: 2019/2/3 Time: 18:57 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}/login" method="post"> 用户名:<input name="username"><br> 密 码:<input type="password" name="password">${msg} </br> <input type="submit" value="登录"> </form> </body> </html>
实体类:User.java
package com.sjl.po; /** * 用户POJO类 * */ public class User { private Integer id; private String username; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
登录之前的拦截器的设置(也是一个session验证):
package com.sjl.interceptor; import com.sjl.po.User; 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; public class LoginInterceptor implements HandlerInterceptor { /** * preHandle():在控制器之前执行,如果返回为true,则放行,返回为false, * 则不往下执行。 * * s1:获取地址栏上的uri,并赋值给url,用getRequestURI(); * s2:如果url这个整体大于等于0则表示存在,此时返回true,并继续放行; * s3:通过控制器绑定的session对象,来获取session对象,然后通过session * 进一步获取session的值,如果能够获取到,不为空,则表示该对象存在,用户 * 之前登录过的,否则没有登录过的,则在前端页面用request传值,并给出提示 * 信息。 * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { //获取请求的URL 方法getRequestURI 获取地址栏上的除了 // localhost:8080的其余的全部 String url=request.getRequestURI(); System.out.println("url:"+url); //URL:除了login.jsp是可以公开的,其它的URL都进行拦截控制 if (url.indexOf("/login")>=0){ return true; } //获取session中用户的信息,如果session已经存在,则表示该用户已经存在, // 曾经登录过,也放行 否则重新转发到登录页面,不再后续执行 HttpSession session=request.getSession(); User user=(User)session.getAttribute("USER_SESSION"); System.out.println("user:"+user); //判断是否有用户数据,如果有,则返回true,继续向下执行 if (user!=null){ return true; } //不符合条件的给出提示信息,并转发到登录页面 request.setAttribute("msg","您还没有登录,请先登录!"); request.getRequestDispatcher("/WEB-INF/view/login.jsp").forward(request,response); //这里直接用return终止了,因为该用户未登录 return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception { } }
说明:request.setAttribute("msg","您还没有登录,请先登录!");这种方式可以传值,即用request传递并绑定值,在前端页面login.jsp用${msg}取值,
这种方法是用的el表达式。
UserController.java
package com.sjl.Controller; import com.sjl.po.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /**注意get/post的使用的区别,通过地址栏来看*/ import javax.servlet.http.HttpSession; @Controller public class UserController { /** * 向登录页面跳转 * */ @RequestMapping(value = "/login",method = RequestMethod.GET) public String toLogin(){ return "login"; } /** * 用户登录 * */ @RequestMapping(value = "/login",method = RequestMethod.POST) public String login(User user, Model model, HttpSession session){ //这个是Spring下的Model org.springframework.ui.Model String username=user.getUsername(); String password=user.getPassword(); //此处模拟从数据库中获取用户名和密码后进行判断 如果是数字是不是用== //明明输入的是数字,int型,可这里为什么是String型 if (username!=null && username.equals("焦婷") && password !=null && password.equals("123456")){ //把对象添加到Session session.setAttribute("USER_SESSION",user); //重定向到主页面的跳转方法 return "redirect:main"; } //绑定并返回一个值 model.addAttribute("msg","用户名或密码错误,请重新登录!"); return "login"; } /** * 向用户主页跳转 * */ @RequestMapping(value = "/main") public String toMain(){ return "main"; } /** * 退出登录 * */ @RequestMapping("/logout") public String logout(HttpSession session){ //清除Session session.invalidate(); //重定向到登录页面的跳转方法 return "redirect:login"; } }
session.setAttribute("USER_SESSION",user);这里是用session来绑定值,并在前端页面main.jsp用${USER_SESSION.username};
main.jsp(#用来获取控制器发送过来的值, 并增加一个超链接,而这个请求交给控制器处理,交给logout处理)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>系统主页</title> </head> <body> 当前用户是${USER_SESSION.username}<br/> <a href="${pageContext.request.contextPath}/logout"> 点我退出</a> </body> </html>
说明:其实这里面把数据库的内容省略了,只是一个模拟登录。
成年人的世界没有那么多的童话,也没有那么多的逆袭。