使用Spring3 实现用户登录以及权限认证

这里我就简单介绍一下,我在实现的时候处理的一些主要的实现。
1.用户登录
<form action="loginAction.do" method="post">
<div class="header">
<h2 class="logo png"></h2>
</div>
<ul>
<li><label>用户名</label><input name="username" type="text" class="text"/></li>
<li/>
<li><label>密 码</label><input name="password" type="password" class="text" /></li>
<li/>
<li class="submits">
<input class="submit" type="submit" value="登录" />
</li>
</ul>
<div class="copyright">© 2013 - 2014 |</div>
</form>
以上是前台页面,后台的就是一个简单的逻辑实现:
@RequestMapping(value="loginAction.do", method=RequestMethod.POST)
public ModelAndView loginAction(@RequestParam(value="username") String username, @RequestParam(value="password") String password, HttpSession session, HttpServletResponse resp, @RequestParam(value="savetime", required=false) String savetime) {
session.removeAttribute(LogConstant.LOGIN_MESSAGE);
SystemUserDataBean user = userDao.getSystemUserByUserName(username);
ModelAndView view = null;
if(user == null) {
view = new ModelAndView(new RedirectView("login.html"));
session.setAttribute(LogConstant.LOGIN_MESSAGE, "用户名不正确");
return view;
}
boolean isPasswordCorrect = EncryptionUtil.compareSHA(password, user.getPassword());
if(isPasswordCorrect){
session.setAttribute(LogConstant.CURRENT_USER, username);
} else{
view = new ModelAndView(new RedirectView("login.html"));
session.setAttribute(LogConstant.LOGIN_MESSAGE, "密码不正确");
}
return view;
}
2.登录信息
这里,在登录页面有一段JavaScript,来显示密码错误等信息:
<script type="text/javascript">
var login_username_info = '<%=request.getSession().getAttribute("currentUser") == null ? "" : request.getSession().getAttribute("currentUser")%>';
var login_message_info = '<%=request.getSession().getAttribute("login_message") == null ? "" : request.getSession().getAttribute("login_message")%>';
if(login_message_info != null && login_message_info != ''){
alert(login_message_info);
}
</script>
3.拦截未登录用户的请求
这里,从页面和后台实现了双重拦截:
页面代码如下:
<%
if(session.getAttribute("currentUser")==null){
%>
window.parent.location='login.html';
<%
}
%>
后台是一个拦截器(servlet-config.xml):
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*.do" />
<bean class="com..log.report.interceptor.AccessStatisticsIntceptor" />
</mvc:interceptor>
</mvc:interceptors>
拦截器的实现是
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class AccessStatisticsIntceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object obj) throws Exception {
String uri = request.getRequestURI().substring(request.getRequestURI().lastIndexOf("/") +1);
if(!AuthorityController.isAuthorized(uri, request.getSession())) {
//校验失败
return false;
// throw new CustomException(LogConstant.USER_NOT_LOGIN);
}
return true;
}
具体如何校验的,会根据用户的权限,就不介绍了
4.返回未登录前访问的页面
首先在页面添加一段脚本,使用jQuery去访问后台
var page = "";
var loc = decodeURIComponent(window.parent.location);
var start = loc.indexOf("Log/") + 8;
var end = loc.indexOf(".html");
page = loc.substr(start, end-start);
if(page != null && page != '') {
alert(page);
$.ajax({
type : "get",
url : "setPreviousPageAction.do?previousPage=" + page + ".html",
success : function(msg){
}
});
}
然后,后台有记录这个页面:
@RequestMapping(value="setPreviousPageAction.do")
public void setPreviousPageAction(@RequestParam(value="previousPage") String previousPage, HttpSession session){
session.setAttribute(LogConstant.PREVIOUS_PAGE, previousPage);
}
在登录完成后,返回这个页面即可。
5.保存用户名密码
登录页面提供一个保存下拉框:
<select class="save_login" id="savetime" name="savetime"> <option selected value="0">不保存</option> <option value="1">保存一天</option> <option value="2">保存一月</option> <option value="3">保存一年</option> </select>
后台在登录时会操作,将信息保存在cookie中:
if(savetime != null) { //保存用户在Cookie
int savetime_value = savetime != null ? Integer.valueOf(savetime) : 0;
int time = 0;
if(savetime_value == 1) { //记住一天
time = 60 * 60 * 24;
} else if(savetime_value == 2) { //记住一月
time = 60 * 60 * 24 * 30;
} else if(savetime_value == 2) { //记住一年
time = 60 * 60 * 24 * 365;
}
Cookie cid = new Cookie(LogConstant.LOG_USERNAME, username);
cid.setMaxAge(time);
Cookie cpwd = new Cookie(LogConstant.LOG_PASSWORD, password);
cpwd.setMaxAge(time);
resp.addCookie(cid);
resp.addCookie(cpwd);
}
前台在发现用户未登录时,会取出cookie中的数据去登录:
if(session.getAttribute("currentUser")==null){
Cookie[] cookies = request.getCookies();
String username = null;
String password = null;
for(Cookie cookie : cookies) {
if(cookie.getName().equals("log_username")) {
username = cookie.getValue();
} else if(cookie.getName().equals("log_password")) {
password = cookie.getValue();
}
}
if(username != null && password != null) {
%>
$.ajax({
type : "post",
url : "loginByCookieAction.do",
data:"username=" + "<%=username%>"+ "&password=" + "<%=password%>",
success : function(msg){
if(msg.status == 'success')
window.parent.location.reload();
else if(msg.status == 'failed')
gotoLoginPage();
}
});
<%
} else {
%>
gotoLoginPage();
<%
}
...
以上就列出了我在解决登录相关问题的方法,代码有点长,就没有全部列出。
# spring
# 权限认证
# spring实现用户登录
# 用户登录
# SpringBoot整合SpringSecurity和JWT的示例
# Springboot+Shiro记录用户登录信息并获取当前登录用户信息的实现代码
# SpringMVC 实现用户登录实例代码
# springmvc+spring+mybatis实现用户登录功能(上)
# springmvc+spring+mybatis实现用户登录功能(下)
# 利用Spring IOC技术实现用户登录验证机制
# Spring mvc 实现用户登录的方法(拦截器)
# spring aop action中验证用户登录状态的实例代码
# Spring Cloud Gateway 使用JWT工具类做用户登录校验功能
# 使用Spring框架实现用户登录
# 我在
# 拦截器
# 不正确
# 是一个
# 我就
# 出了
# 就不
# 提供一个
# 介绍一下
# 不保存
# 实现了
# 下拉框
# 完成后
# removeAttribute
# false
# setAttribute
# EncryptionUtil
# getSystemUserByUserName
# isPasswordCorrect
相关文章:
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
如何用PHP快速搭建CMS系统?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
南宁网站建设制作定制,南宁网站建设可以定制吗?
如何解决ASP生成WAP建站中文乱码问题?
山东网站制作公司有哪些,山东大源集团官网?
如何在Golang中指定模块版本_使用go.mod控制版本号
在线制作视频网站免费,都有哪些好的动漫网站?
详解jQuery停止动画——stop()方法的使用
C++中引用和指针有什么区别?(代码说明)
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何选择建站程序?包含哪些必备功能与类型?
定制建站流程步骤详解:一站式方案设计与开发指南
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何快速搭建支持数据库操作的智能建站平台?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
制作销售网站教学视频,销售网站有哪些?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
c# 在ASP.NET Core中管理和取消后台任务
香港网站服务器数量如何影响SEO优化效果?
如何快速重置建站主机并恢复默认配置?
独立制作一个网站多少钱,建立网站需要花多少钱?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何在阿里云服务器自主搭建网站?
C++如何使用std::optional?(处理可选值)
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何快速辨别茅台真假?关键步骤解析
香港服务器选型指南:免备案配置与高效建站方案解析
如何零基础在云服务器搭建WordPress站点?
宝塔建站无法访问?如何排查配置与端口问题?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
七夕网站制作视频,七夕大促活动怎么报名?
如何访问已购建站主机并解决登录问题?
黑客如何通过漏洞一步步攻陷网站服务器?
如何通过FTP服务器快速搭建网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
济南网站制作的价格,历城一职专官方网站?
建站之星后台密码遗忘?如何快速找回?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
测试制作网站有哪些,测试性取向的权威测试或者网站?
,想在网上投简历,哪几个网站比较好?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
*请认真填写需求信息,我们会在24小时内与您取得联系。