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>

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

优质内容筛选与推荐>>
1、Java8新特性--Optional
2、王家林“云计算分布式大数据Hadoop实战高手之路---从零开始”的第一讲Hadoop图文训练课程:10分钟理解云计算分布式大数据处理框架Hadoop
3、美团霸面---我想说说心里话。
4、用两个栈实现队列
5、2018 书单


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn