欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springMVC+request.session实现用户登录和访问权限控制

程序员文章站 2022-04-24 18:28:14
用springmvc mybatis实现用户登录登出功能,使用session保持登录状态,并实现禁止未登录的用户访问。感谢谷歌资源,在这里做个学习记录加深自己的印象。 原文在我的 "https://my.oschina.net/finchxu/blog/3010138" 接着上次的整合 "https ......

用springmvc mybatis实现用户登录登出功能,使用session保持登录状态,并实现禁止未登录的用户访问。感谢谷歌资源,在这里做个学习记录加深自己的印象。
原文在我的
接着上次的整合

上传到了github方便查看

src
 └── main── java
     │      └── cn── book
     │               ├── controller
     │               │   ├── bookscontroller.java
     │               │   ├── logininterceptor.java
     │               │   └── userscontroller.java
     │               ├── mapper
     │               │   ├── booksmapper.java
     │               │   ├── booksmapper.xml
     │               │   ├── usersmapper.java
     │               │   └── usersmapper.xml
     │               ├── pojo
     │               │   ├── bookadmin.java
     │               │   └── useradmin.java
     │               └── service
     │                   ├── booksserviceimpl.java
     │                   ├── booksservice.java
     │                   ├── usersserviceimpl.java
     ├── resources       └── usersservice.java
     │   ├── applicationcontext-dao.xml
     │   ├── applicationcontext-service.xml
     │   ├── applicationcontext-trans.xml
     │   ├── jdbc.properties
     │   ├── log4j.properties
     │   ├── spring-mvc.xml
     │   └── sqlmapconfig.xml
     └── webapp
           ├── index.jsp
           └── web-inf
               ├── jsp
               │   ├── bookdetail.jsp
               │   ├── fail.jsp
               │   ├── home.jsp
               │   ├── listbooks.jsp
               │   ├── updatepage.jsp
               │   └── userlogin.jsp
               ├── static
               │   ├── img
               │   └── js
               │       └── jquery3.js
               └── web.xml

先看controller吧,还是两步,进入/home/userlogin页面,然后输入用户名和密码开始登陆,验证用户名和密码,正确就建立session保持状态,错误就提示重新输入。

@controller
@requestmapping("/home")
public class userscontroller {
    @autowired
    private usersservice usersservice;

    //进入login页面
    @requestmapping("/userlogin")
    public string userlogin(){
        return "userlogin";
    }
    //执行login操作,匹配用户名和密码,建立session持久连接
    @requestmapping(value = "/login",method = requestmethod.post)
    public string login(useradmin useradmin, model model, httpservletrequest request){
        useradmin = usersservice.checklogin(useradmin.getuser_name(),useradmin.getuser_password());
        if (useradmin != null){
            model.addattribute(useradmin);
            request.getsession(true).setattribute("useradmin",useradmin);
            return "redirect:/a/listbooks";
        }else {
            model.addattribute("message","登录名或密码错误!");
            return "userlogin";
        }
    }
    //logout登出,其实就是删除之前登录时设置的session
    @requestmapping("/logout")
    public string logout(httpservletrequest request) {
        request.getsession().removeattribute("useradmin");
        return "redirect:userlogin";
    }
}

service部分实现验证用户密码正确与否

接口
@service
public interface usersservice {
    useradmin checklogin(string user_name,string user_password);
}
实现
@service
@transactional
public class usersserviceimpl implements usersservice{
    @autowired
    private usersmapper usersmapper;
    @override
    public useradmin checklogin(string user_name,string user_password){
        useradmin useradmin = usersmapper.finduserbyname(user_name);
        if (useradmin != null && useradmin.getuser_password().equals(user_password)){
            return useradmin;
        }
        return null;
    }
}

然后要设置访问控制,只有登录的用户才能访问所有页面,当然这个/home/userlogin页面肯定要排除不然怎么登录啊。下边写一个拦截器。

重写了handlerinterceptor的接口,三个方法,这里只用prehandle()方法。prehandle()方法,boolean布尔类型,false表示请求结束,true代表继续执行(如果是最后一个拦截器那么就会调用当前controller的方法)

public class logininterceptor implements handlerinterceptor {
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
        //获取请求的地址(根域名以外的部分)
        string uri = request.getrequesturi();
        if (uri.indexof("/home/userlogin") >= 0){
            return true;
        }
        //获取session,有就是说明已经登录,没有就是拦截访问并跳转到登录页面
        httpsession session = request.getsession();
        useradmin useradmin = (useradmin) session.getattribute("useradmin");
        if (useradmin != null){
            return true;
        }
        request.setattribute("msg","还没登陆!快去登陆啊!");
        request.getrequestdispatcher("/web-inf/jsp/userlogin.jsp").forward(request,response);
        return false;
    }
    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception {
    }
    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {
    }
}

写个userlogin.jsp

<%@ page contenttype="text/html;charset=utf-8" language="java" %>
<html>
<head>
    <title>快登录!</title>
    <style>
        #center{
            border-radius: 20px;
            width: 300px;
            height: 350px;
            margin: auto;
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
        }
    </style>
    <link rel="stylesheet" type="text/css" href="static/lib/bootstrap43/css/bootstrap.min.css"/>
    <script type="text/javascript" src="static/js/jquery3.js"></script>
    <script src="static/lib/bootstrap43/js/bootstrap.min.js"></script>
</head>
<body bgcolor="#ffe4c4">
<div id="center">
    <h2>欢迎登录图书管理系统</h2>
    <div style="color: deeppink">
        <p>${message }</p>  <%--这里显示上边的controller里边用户或者密码错误的信息--%>
    </div>
    <form id="login" action="${pagecontext.request.contextpath}/home/login" method="post">
        <table class="table">
            <tr>
                <td>用户名:</td>
                <td><input type="text" id="user_name" name="user_name" class="form-control"/></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" id="user_password" name="user_password" class="form-control"/></td>
            </tr>
            <tr>
                <td><input type="submit" value="点击登录" id="login0"/></td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

当然还有实体类和mapper

pojo:
public class useradmin {
    integer user_id;
    string user_name;
    string user_password;
    ...get和set...省略
}

mapper.java:
public interface usersmapper {useradmin finduserbyname(string user_name);}

mapper.xml:
<?xml version="1.0" encoding="utf-8" ?>
<!doctype mapper
        public "-//mybatis.org//dtd mapper 3.0//en"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.book.mapper.usersmapper">
    <sql id="base_table">
        useradmin
    </sql>
    <sql id="base_column">
        user_id,user_name,user_password
    </sql>
    <select id="finduserbyname" parametertype="string" resulttype="useradmin">
        select * from useradmin where user_name = #{user_name}
    </select>
</mapper>

感谢谷歌提供的资源。