登录和权限验证判断在后台管理系统中是最常用的功能,这部分代码是比较固定和独立的,为了减少对业务代码入侵性,一般我会考虑使用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实现登录及权限验证判断相关推荐

  1. java按钮权限控制_详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Se ...

  2. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  3. java性能最好的mvc框架_详解Spring MVC的异步模式(高性能的关键)

    什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器 ...

  4. CORS跨域资源共享(二):详解Spring MVC对CORS支持的相关类和API【享学Spring MVC】

    每篇一句 重构一时爽,一直重构一直爽.但出了问题火葬场 前言 上篇文章通过我模拟的跨域请求实例和结果分析,相信小伙伴们都已经80%的掌握了CORS到底是怎么一回事以及如何使用它.由于Java语言中的w ...

  5. java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验

    why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收B ...

  6. java 配置文件的路径_详解java配置文件的路径问题

    详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...

  7. java新建一个女朋友_详解java创建一个女朋友类(对象啥的new一个就是)==建造者模式,一键重写...

    创建一个女朋友,她有很多的属性,比如:性别,年龄,身高,体重,类型等等,虽然每个女朋友都有这些属性,但是每个人找女朋友的要求都是不一样的,有的人喜欢男的,有的人喜欢女的,有的喜欢胖的,不同的人可以根据 ...

  8. java mysql 自动提交_详解MySQL与Spring的自动提交(autocommit)

    1 MySQL的autocommit设置 MySQL默认是开启自动提交的,即每一条DML(增删改)语句都会被作为一个单独的事务进行隐式提交.如果修改为关闭状态,则执行DML语句之后要手动提交 才能生效 ...

  9. java全局异常处理_详解Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

最新文章

  1. Spark源码的编译过程详细解读(各版本)(博主推荐)
  2. 算法导论之概率分析和随机算法
  3. python cms应用生成_Django CMS应用程序H教程
  4. Windows 2003 群集的搭建
  5. Python回调函数用法实例
  6. java feign同时传对象和其他参数_关于Spirng Cloud的Feign传参问题:
  7. Mybatis源码分析第一天------Mybatis实用篇
  8. 华为Mate30系列5G版正式开售:有了5G套餐 入手正当时
  9. 「管理数学基础」3.2 凸分析:凸函数
  10. 2019春第十二周作业Compile Summarize
  11. 《人人都是产品经理》读后小结
  12. keras 的层,中文
  13. 【是程序猿就干了这碗心灵鸡汤】我们这一代人的困惑
  14. Chapter 3 Raster Images
  15. 检测PCB板电路的短路情况试错之路
  16. 关闭 Eureka 自我保护模式
  17. java代码耗尽内存_为什么运行Java应用程序的计算机几乎耗尽了物理内存,但仍然可以运行数周...
  18. 支持向量机基本原理与思想
  19. python基础知识点大全
  20. Vivado错误[Place30-494]

热门文章

  1. 什么是javax.ws.rs.core.context? [ 第2部分 ]
  2. 您在2016年会做什么? Apache Spark,Kafka,Drill等
  3. Apache Camel 2.16发布–十大亮点
  4. 在Spring Boot中使用@ConfigurationProperties
  5. ActiveMQ中的温度,存储和内存使用百分比
  6. RIP RETE时间获得PHREAKY
  7. JMeter定制功能实现
  8. 高级ZK:异步UI更新和后台处理–第1部分
  9. Apache JMeter:随心所欲进行负载测试
  10. JavaOne正在重建动力