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。你可以根据自己需要添加多个。
java springmvc权限校验_详解Spring MVC使用Filter实现登录及权限验证判断相关推荐
- java按钮权限控制_详解Spring Security 中的四种权限控制方式
Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...
- java中batch基础_详解Spring batch 入门学习教程(附源码)
详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...
- java性能最好的mvc框架_详解Spring MVC的异步模式(高性能的关键)
什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器 ...
- CORS跨域资源共享(二):详解Spring MVC对CORS支持的相关类和API【享学Spring MVC】
每篇一句 重构一时爽,一直重构一直爽.但出了问题火葬场 前言 上篇文章通过我模拟的跨域请求实例和结果分析,相信小伙伴们都已经80%的掌握了CORS到底是怎么一回事以及如何使用它.由于Java语言中的w ...
- java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验
why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收B ...
- java 配置文件的路径_详解java配置文件的路径问题
详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...
- java新建一个女朋友_详解java创建一个女朋友类(对象啥的new一个就是)==建造者模式,一键重写...
创建一个女朋友,她有很多的属性,比如:性别,年龄,身高,体重,类型等等,虽然每个女朋友都有这些属性,但是每个人找女朋友的要求都是不一样的,有的人喜欢男的,有的人喜欢女的,有的喜欢胖的,不同的人可以根据 ...
- java mysql 自动提交_详解MySQL与Spring的自动提交(autocommit)
1 MySQL的autocommit设置 MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单独的事务进行隐式提交.如果修改为关闭状态,则执行DML语句之后要手动提交 才能生效 ...
- java全局异常处理_详解Spring全局异常处理的三种方式
在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...
最新文章
- Spark源码的编译过程详细解读(各版本)(博主推荐)
- 算法导论之概率分析和随机算法
- python cms应用生成_Django CMS应用程序H教程
- Windows 2003 群集的搭建
- Python回调函数用法实例
- java feign同时传对象和其他参数_关于Spirng Cloud的Feign传参问题:
- Mybatis源码分析第一天------Mybatis实用篇
- 华为Mate30系列5G版正式开售:有了5G套餐 入手正当时
- 「管理数学基础」3.2 凸分析:凸函数
- 2019春第十二周作业Compile Summarize
- 《人人都是产品经理》读后小结
- keras 的层,中文
- 【是程序猿就干了这碗心灵鸡汤】我们这一代人的困惑
- Chapter 3 Raster Images
- 检测PCB板电路的短路情况试错之路
- 关闭 Eureka 自我保护模式
- java代码耗尽内存_为什么运行Java应用程序的计算机几乎耗尽了物理内存,但仍然可以运行数周...
- 支持向量机基本原理与思想
- python基础知识点大全
- Vivado错误[Place30-494]
热门文章
- 什么是javax.ws.rs.core.context? [ 第2部分 ]
- 您在2016年会做什么? Apache Spark,Kafka,Drill等
- Apache Camel 2.16发布–十大亮点
- 在Spring Boot中使用@ConfigurationProperties
- ActiveMQ中的温度,存储和内存使用百分比
- RIP RETE时间获得PHREAKY
- JMeter定制功能实现
- 高级ZK:异步UI更新和后台处理–第1部分
- Apache JMeter:随心所欲进行负载测试
- JavaOne正在重建动力