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

用springmvc mybatis实现用户登录登出功能,使用session保持登录状态,并实现禁止未登录的用户访问。感谢谷歌资源,在这里做个学习记录加深自己的印象。
本文原文写在我得开源中国https://my.oschina.net/finchxu/blog/3010138
接着上次的整合https://my.oschina.net/finchxu/blog/3007984

上传到了github方便查看https://github.com/finch-xu/springbook/tree/1.2.6

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>

感谢谷歌提供的资源。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • 拦截一些请求进行处理,比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,编码,或者限制时间点访问等等,...
    JackFrost_fuzhu阅读 1,925评论 0 7
  • 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Se...
    chinariver阅读 5,501评论 1 49
  • Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。...
    Cherry300阅读 432评论 0 1
  • 学习任务目标 用户必须要登陆之后才能访问定义链接,否则跳转到登录页面。 对链接进行权限控制,只有当当前登录用户有这...
    z77z阅读 71,254评论 39 275
  • 自上周末和闺蜜从厦门回来后又开始了一周平平淡淡的工作,还迎接了小小外甥女的破壳日。很久没有出去走走了,不知什么时候...
    程子星阅读 156评论 0 2