用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>

感谢谷歌提供的资源。

springMVC+request.session实现用户登录和访问权限控制的更多相关文章

  1. .net MVC使用Session验证用户登录(转载)

    .net MVC使用Session验证用户登录   用最简单的Session方式记录用户登录状态 1.添加DefaultController控制器,重写OnActionExecuting方法,每次访问 ...

  2. easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)

    easyui datagrid 禁止选中行   没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...

  3. Asp.Net使用加密cookie代替session验证用户登录状态 源码分享

    首先 session 和 cache 拥有各自的优势而存在.  他们的优劣就不在这里讨论了. 本实例仅存储用户id于用户名,对于多级权限的架构,可以自行修改增加权限字段   本实例采用vs2010编写 ...

  4. samba共享目录无法访问的一般解决方案,非用户登录和读写权限问题

    配smb,被第四点坑了很久,特此转载. 由于这5点都是比较普通的情况,不涉及用户登录和读写权限问题 1)关闭防火墙: #sevice iptables stop 2)修改 /etc/samba/smb ...

  5. Kubernetes RBAC授权普通用户对命名空间访问权限

    Kubernetes RBAC授权普通用户对命名空间访问权限 官方文档:https://www.cnblogs.com/xiangsikai/p/11413970.html kind: Role ap ...

  6. 【netcore基础】wwwroot下静态资源文件访问权限控制

    本文参考如下博问 https://q.cnblogs.com/q/107836 业务要求 上传的资源文件(.mp3 .mp4等)只有购买了之后才能有权限访问,所以对上传的资源文件目录进行访问权限控制 ...

  7. MongoDB 安全和访问权限控制

    MongoDB的访问控制能够有效保证数据库的安全,访问控制是指绑定Application监听的IP地址,设置监听端口,使用账户和密码登录 一,访问控制的参数 1,绑定IP地址 mongod 参数:-- ...

  8. IAM:亚马逊访问权限控制

    IAM的策略.用户->服务器(仓库.业务体) IAM:亚马逊访问权限控制(AWS Identity and Access Management )IAM使您能够安全地控制用户对 AWS 服务和资 ...

  9. DRF之访问权限控制和访问频率控制(节流)

    权限控制 前言 用户验证用户权限,根据不同访问权限控制对不同内容的访问. 建议了解视图.token验证的内容. 使用流程 自定义访问权限类,继承BasePermission,重写has_permiss ...

随机推荐

  1. Javascript四种调用模式中的this指向

    第一种:函数直接调用执行的模式 function add(a,b){ console.log(this); return a+b; } add(,) //this===window 这里的this指向 ...

  2. AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)

    题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_C All Pairs Shortest Path Input ...

  3. VB创建文件夹

    If Dir("D:\Program Files\AutoCAD 2006\Express\", vbDirectory) = "" Then '判断文件夹是否 ...

  4. Python数据分析前提-----pandas

    1.read_csv(url):读取数据 2.help(read_csv):打印函数相关用法 3.数据名.dtypes:读取数据的类型(int.float……) 4.type(数据名):读取所有数据的 ...

  5. 【BZOJ4487】【JSOI2015】染色问题

    题意: 棋盘是一个n×m的矩形,分成n行m列共n*m个小方格.现在萌萌和南南有C种不同颜色的颜料,他们希望把棋盘用这些颜料染色,并满足以下规定:  1.  棋盘的每一个小方格既可以染色(染成C种颜色中 ...

  6. 洛谷 P1417 烹调方案 (01背包拓展)

    一看到这道题就是01背包 但是我注意到价值和当前的时间有关. 没有想太多,直接写,0分 然后发现输入方式不对-- 改了之后只有25分 我知道wa是因为时间会影响价值,但不知道怎么做. 后来看了题解,发 ...

  7. python学习--导入自己的包

    定义一个自己的方法包: def myFunc(x): if x > 10: return x else: return -x 在需要的地方导入包: # 导入自定义的方法包 from learn ...

  8. 题解 P3372 【【模板】线段树1 】(zkw)

    看了一下题解里的zkw线段树,感觉讲的不是很清楚啊(可能有清楚的但是我没翻到,望大佬勿怪). 决定自己写一篇...希望大家能看明白... zkw线段树是一种优秀的非递归线段树,速度比普通线段树快两道三 ...

  9. 《Spring技术内幕》笔记-Spring的设计理念和总体架构

    1.Spring的主要子项目:     -1.Spring Framework(Core):Spring项目的核心.提供IoC,AOP,MVC等核心功能.     -2.Spring Web Flow ...

  10. SVN配置以及自己主动部署到apache虚拟文件夹

    SVN配置以及自己主动部署到apache虚拟文件夹 一.VisualSVN server 服务端和TortoiseSVNclient下载 VisualSVN下载:http://subversion.a ...