zoukankan      html  css  js  c++  java
  • 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>&nbsp;&nbsp;码:<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>

     说明:其实这里面把数据库的内容省略了,只是一个模拟登录。

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    DB设计原则
    英文地址[转]
    ICollection
    雅虎优化14条
    vue过滤器
    php中echo(),print(),print_r()之间的区别
    jQ中对attr()方法的理解
    浅析call和apply的不同
    浅析call和apply
    PHP是弱类型语言,自动转换,强制转换
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/10442633.html
Copyright © 2011-2022 走看看