java springmvc权限校验_详解Spring MVC使用Filter实现登录及权限验证判断

登录和权限验证判断在后台管理系统中是最常用的功能,这部分代码是比较固定和独立的,为了减少对业务代码入侵性,一般我会考虑使用Filter来实现,下面我就来详细说一下我的实现思路和代码:

前台页面:

String path = request.getContextPath();

String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";

%>

会员登录--蓝狐通用后台管理系统

#line-chart {

height: 300px;

width: 800px;

margin: 0px auto;

margin-top: 1em;

}

.brand {

font-family: georgia, serif;

}

.brand .first {

color: #ccc;

font-style: italic;

}

.brand .second {

color: #fff;

font-weight: bold;

}

会员登录

  • ${errorMessage}

用户名

密码

登录页面很简单就是一个登录表单。

后台Controller:

package com.lanhusoft.controllers;

import com.lanhusoft.dao.mybatis.UserInfoImpl;

import com.lanhusoft.model.Sys_UserInfo;

import com.lanhusoft.model.VAuthenticatedUser;

import com.lanhusoft.model.VSysUserInfo;

import org.hibernate.Session;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;

import java.util.List;

import java.util.Map;

import java.util.Objects;

/**

* Created by Administrator on 2016/8/15.

*/

@Controller

@RequestMapping("/account")

public class AccountController {

@Autowired

VAuthenticatedUser currentUser;

@RequestMapping(value="/logon",method = RequestMethod.GET)

public String Logon(){

return "Account/Logon";

}

@RequestMapping(value="/logon",method = RequestMethod.POST)

public ModelAndView LogonHandler(Sys_UserInfo user,HttpSession session){

UserInfoImpl dal=new UserInfoImpl();

ModelAndView mav=new ModelAndView("Account/Logon");

String errorMsg="";

if(user.getLoginName()==null||user.getLoginName()==""||user.getPwd()==null||user.getPwd()==""){

errorMsg = "用户名或密码不能为空";

mav.addObject("errorMessage",errorMsg);

return mav;

}

VAuthenticatedUser authUser=dal.getLegalUserByLoginName(user);

if(authUser==null||authUser.getUserInfo()==null) {

errorMsg = "用户名不存在";

}

else if(authUser.getUserInfo().getEnabled()!=1){

errorMsg = "用户未启用";

}

else if(!Objects.equals(authUser.getUserInfo().getPwd(), user.getPwd())){

errorMsg = "密码错误";

}

else {

session.setAttribute("currentUser",authUser);

//currentUser=authUser;

mav.setViewName("redirect:/SysUser/index");

return mav;

}

mav.addObject("errorMessage",errorMsg);

return mav;

}

@RequestMapping(value="/logout",method = RequestMethod.GET)

public String Logout(HttpSession session){

session.removeAttribute("currentUser");

return "Account/Logon";

}

}

登录成功把把用户信息和权限菜单存到sessoin中,key为currentUser。

Filter,登录及权限验证判断真实的核心代码:

package com.lanhusoft.filters;

import com.lanhusoft.model.Sys_Action;

import com.lanhusoft.model.VAuthenticatedUser;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.FilterChain;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* Created by Administrator on 2016/9/3.

*/

public class AuthFilter extends OncePerRequestFilter {

// @Autowired

// VAuthenticatedUser currentUser;

@Override

protected void doFilterInternal(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, javax.servlet.FilterChain filterChain) throws ServletException, IOException {

// 不过滤的uri

String[] notFilter = new String[]{"login.html", "index.html"};

// 请求的uri

String uri = request.getRequestURI();

boolean doFilter = true;

for (String s : notFilter) {

if (uri.indexOf(s) != -1) {

// 如果uri中包含不过滤的uri,则不进行过滤

doFilter = false;

break;

}

}

if (doFilter) {

// 执行过滤

// 从session中获取登录者实体

VAuthenticatedUser authUser = (VAuthenticatedUser) request.getSession().getAttribute("currentUser");

response.setContentType("text/html; charset=utf-8");

PrintWriter out = response.getWriter();

if (null == authUser) {

// 如果session中不存在登录者实体,则弹出框提示重新登录

// 设置request和response的字符集,防止乱码

//request.setCharacterEncoding("UTF-8");

//response.setCharacterEncoding("UTF-8");

StringBuilder builder = new StringBuilder();

builder.append("

builder.append("alert('网页过期,请重新登录!');");

builder.append("window.top.location.href='"+request.getContextPath()+"/account/logon';");

builder.append("");

out.print(builder.toString());

//response.sendRedirect(request.getContextPath()+"/account/logon");

} else {

// 如果session中存在登录者实体,则继续

boolean havePrivi = false;

for (Sys_Action act : authUser.getAuthorizedActions()) {

if (uri.contains(act.getActionHref())) {

havePrivi = true;

break;

}

}

if (havePrivi) {

filterChain.doFilter(request, response);

} else {

out.print("你没有该页面的访问权限");

}

}

} else {

// 如果不执行过滤,则继续

filterChain.doFilter(request, response);

}

}

}

web.xml加入以下配置:

authFilter

com.lanhusoft.filters.AuthFilter

authFilter

/SysUser/*

authFilter

/SysRole/*

filter-mapping结点中的url-pattern定义了需要验证的url。你可以根据自己需要添加多个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记本电脑电源已接通未充电_dell xps15 电源已接通 未充电 维修方法

(去年写的文章,在知乎也存一份)网上类似的文章很多,这里总结一下,这个问题按照严重程度可以分为四个层次:电源计划问题,大部分百度出来说的都是这个,实际上这个问题 等于没有问题。改…

cors spring_Spring,REST,Ajax和CORS

cors spring假设您正在为客户端开发基于JavaScript的项目,并且他通过其余的Web服务向服务器发出ajax请求,那么您可能会遇到一些麻烦,尤其是如果双方都在单独的域中。 实际上,出于安全原因,从一个域A到另一域B的Ajax请…

mysql bc_正则表达式——MySQL搜索过滤

正则表达式介绍在数据库的数据过滤过程中只用WHERE子句和LIKE操作符都是对于已知值进行的不管是匹配一个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,都是使用已知的值当然MySQL语句也提供了通配符百分号(%)和下划线(_)来匹配多…

everything安装版和便携版有什么区别_A2奶粉内幕:国行版和澳洲版有什么区别 贵的不一定好!...

点击上方蓝字 关注我们申明:此文章来自第三方平台,绝无倾向性诱导。二桐粑粑转载分享。A2是全球首款添加了“A2-β酪蛋白”的奶粉,由新西兰A2公司于2013年推出,这款奶粉在澳洲一上架,就被妈妈们一扫而空。之后A2公司针…

哈希杰森

我最近写了一个简单的库,可预测地对json进行哈希处理 。 该实用程序基于出色的Jackson Json解析库构建 问题 我需要从相当大的基于json的内容生成的哈希值,以便稍后确定内容是否发生了更改。 将json视为字符串不是格式化的选项,键改组可能会…

java 什么时候用递归_如果要用Java实现算法,一定慎用递归

现象 :递归是我们很经典的一种算法实现,可以很好的描述一个算法的原理!对于算法的描述、表现和代码结构理解上,递归都是不错的选择!但是本文想说的是java实现一个递归算法的时候尽量不要用递归实现,而是转换…

excel分两个独立窗口_Excel2010 多个独立窗口,解决单窗口无法显示多个文件的问题...

当我们需要编辑多个excel的时候,就会发现一个问题,Excel不能一个窗口下显示多个文档,每次编辑都进行切换就太麻烦了,那如何能解决这个问题呢?接下来跟我一起看看吧!首先在开始菜单输入regedit.exe命令&…

jsp代码会被翻译成java代码吗_JAVA jsp技术

JSP的本质是一个类文件,它存储于tomcat(如果你使用tomcat)目录下的work文件夹中,该类文件继承了HttpJspBase类,而HttpJspBase类继承了HttpServlet类,所以其实质是一个servlet的类文件JSP脚本:1) ----- 内部的java代码翻…

excel冻结窗口_excel怎么冻结窗口?excel冻结窗口怎么设置?

excel冻结行或列的技巧教程:一、冻结第一列1.选择 视图 > 冻结窗格 > 冻结第一列。2.列A和列B之间出现的细线表明第一列已冻结。二、冻结前两列1.选择第三列。2.选择 查看 > 冻结窗格 > 冻结窗格。三、冻结列和行1.选择要在滚动时保持可见的行下方和列右…

java 判断对象是否是xml格式_java对象与xml格式之间的转换

java对象是可以直接与xml相互转换的,但需要导入包:xstream-1.3.1.jar,在创建对象的时候,注意一定要new一个DomDriver;成功的测试代码如下:package com.xml; import com.thoughtworks.xstream.XStream; impo…

复合主键 复合外键_复合双重错误

复合主键 复合外键总览 在上一篇文章中,我概述了为什么BigDecimal大部分时间都不是答案。 尽管可以构造double会产生错误的情况,但在BigDecimal遇到错误的情况下构造情况也一样容易。 BigDecimal更容易正确,但更容易出错。 轶事证据表明&…

web service接口_win7 添加环回网卡+H3C 模拟器 防火墙开启Web功能

1、按下win R键,在其中输入:hdwwiz,然后点击“确定”或者按回车键,打开“添加硬件”对话框。2、看到如下界面时,选择“网络适配器”(如下图所示), 在接着出现的界面中,左方“厂商”一栏里选择“…

java 实现nfa的化简_DFA与NFA的等价性,DFA化简

等价性对于每个NFA M存在一个DFA M’,使得L(M)L(M’)--------等价性证明,NFA的确定化假定NFA M,我们对M的状态转换图进行以下改造:解决初始状态唯一性:引进新的初态结点X和终态结点Y,X,Y∉S,从X…

eclipse查看git地址_gitamp;github的入门实战

一、Git概述(1)定义Git是目前世界上最先进的分布式版本控制系统。(2)能干什么?解决冲突、管理权限、代码备份、协同开发、版本还原、历史追查、版本记录、分支管理、代码审查(3)集中管理型版本管…

使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...

发布-订阅消息系统在任何企业体系结构中都起着重要作用,因为它可以实现可靠的集成而无需紧密耦合应用程序。 在解耦的系统之间共享数据的能力并不是一个容易解决的问题。 考虑一个企业,其中具有使用不同语言和平台独立构建的多个应用程序。 它需要以响应…

php-fpm不停机更新,PHP-FPM 无法停止,停止后自动重启

问题描述今天修改了一个 php-fpm.conf 的配置:daemonize yes。然后使用 kill -USR2 cat /usr/local/var/run/php-fpm.pid 重启 php-fpm.执行 ps -ef | grep php-fpm 的结果如下图:501 25131 1 0 9:31下午 ?? 0:00.37 /usr/local/opt/php/sbin/php-fpm…

LINUX系统无线网频繁断开_Ubuntu系统安装amp;amp;解决WiFi不可用

写系统安装的文章太多太多了,我为何还要写哪? 因为文章太多太多了,乍一看各种操作猛如虎,实际上可能对你没有一点的帮助。好多文章只是讲解了如何安装ubuntu系统,对于安装后遇到的问题只字不提,笔者决定写一…

php 经典的算法,PHP各种经典算法

//-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low < $high){ $mid intval(($low$high)/2 ); if ($array[$mid] $k){ …

return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数&#xff0c;并且要求算法的时间复杂度为 O(log(m n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 [1, 3]nums2 [2]​则中位数是 2.0示例 2:nums1 [1, 2]nums2 [3, 4]​则中…

intellij 使用_使用IntelliJ书签

intellij 使用这是有关IntelliJ的精美书签功能的快速帖子。 IntelliJ使您可以为单行代码添加书签。 将某行添加为书签后&#xff0c;您可以使用多种方法直接跳回该行。 因此&#xff0c;最好在您经常使用的代码位置添加书签。 要创建一个新书签&#xff0c;只需在代码编辑器中…