一、权限码

/**
* @Title: AuthCode.java
* @Package cn.com.kamfu.auth
* @Description: TODO(用一句话描述该文件做什么)
* @author: liandy
* @date: 2019年7月15日 下午10:07:45
* @version V1.0
*/
package cn.com.kamfu.auth; /**
* @ClassName: AuthCode
* @Description:TODO(这里用一句话描述这个类的作用)
* @author: liandy
* @date: 2019年7月15日 下午10:07:45
*
*/
public enum AuthCode {
index("1", "001", "首页"),
userAdd("2", "002", "新增用户", "新增用户"),
userDelete("3", "003", "删除用户", "删除用户"),
userEdit("4", "004", "修改用户", "修改用户"),
userQuery("5", "005", "查询用户", "查询用户"); private String authId;
private String authCode;
private String authName;
private String authDesc;
private AuthCode(String authId, String authCode, String authName) {
this.authId = authId;
this.authCode = authCode;
this.authName = authName;
}
private AuthCode(String authId, String authCode, String authName, String authDesc) {
this.authId = authId;
this.authCode = authCode;
this.authName = authName;
this.authDesc = authDesc;
}
public String getAuthId() {
return authId;
}
public void setAuthId(String authId) {
this.authId = authId;
}
public String getAuthCode() {
return authCode;
}
public void setAuthCode(String authCode) {
this.authCode = authCode;
}
public String getAuthName() {
return authName;
}
public void setAuthName(String authName) {
this.authName = authName;
}
public String getAuthDesc() {
return authDesc;
}
public void setAuthDesc(String authDesc) {
this.authDesc = authDesc;
} }

AuthCode

二、权限校验标识

/**
* @Title: AuthValidate.java
* @Package cn.com.kamfu.auth
* @Description: TODO(用一句话描述该文件做什么)
* @author: liandy
* @date: 2019年7月15日 下午10:07:08
* @version V1.0
*/
package cn.com.kamfu.auth; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @ClassName: AuthValidate
* @Description:权限校验标识
* @author: liandy
* @date: 2019年7月15日 下午10:07:08
*
*/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthValidate {
AuthCode value() ;
}

AuthValidate

三、业务异常类

/**
* @Title: BusinessException.java
* @Package cn.com.kamfu.exception
* @Description: TODO(用一句话描述该文件做什么)
* @author: liandy
* @date: 2019年7月15日 下午10:16:50
* @version V1.0
*/
package cn.com.kamfu.exception; /**
*
* 项目名称:---
* 模块名称:接入层
* 功能描述:异常类
* 创建人: mao2080@sina.com
* 创建时间:2017年5月9日 下午8:22:21
* 修改人: mao2080@sina.com
* 修改时间:2017年5月9日 下午8:22:21
*/
public class BusinessException extends Exception{ public BusinessException() { } public BusinessException(String message) {
super(message);
} }

BusinessException

四、拦截器

/**
* @Title: UserLoginInterceptor.java
* @Package cn.com.kamfu.interceptor
* @Description: TODO(用一句话描述该文件做什么)
* @author: liandy
* @date: 2019年7月15日 下午10:13:50
* @version V1.0
*/
package cn.com.kamfu.interceptor; import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.springframework.context.support.StaticApplicationContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import cn.com.kamfu.auth.AuthCode;
import cn.com.kamfu.auth.AuthValidate;
import cn.com.kamfu.exception.BusinessException;
import cn.com.kamfu.model.User;
import cn.com.kamfu.util.JsonUtil; /**
*
* 项目名称:---
* 模块名称:接入层
* 功能描述:用户访问拦截器(利用SpringMVC自定义拦截器实现)
* 创建人: mao2080@sina.com
* 创建时间:2017年4月25日 下午8:53:49
* 修改人: mao2080@sina.com
* 修改时间:2017年4月25日 下午8:53:49
*/
public class UserAccessInterceptor implements HandlerInterceptor { /**
*
* 描述:构造函数
* @author mao2080@sina.com
* @created 2017年4月28日 下午5:20:34
* @since
* @param accessService
*/
public UserAccessInterceptor() { } /**
*
* 描述:执行方法前
* @author mao2080@sina.com
* @created 2017年4月25日 下午9:01:44
* @since
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param handler handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
//校验登录
this.userLoginValidate(request,response);
//校验权限
this.userAuthValidate(request, handler);
} catch (Exception e) {
e.printStackTrace();
printMessage(response,e.getMessage());
return false;
}
return true;
} /**
*
* 描述:输出到前端
* @author mao2080@sina.com
* @created 2017年4月28日 上午11:00:25
* @since
* @param response 响应
* @param res 对象
* @throws Exception
*/
public static void printMessage(HttpServletResponse response, Object res) throws Exception{
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=utf-8");
try {
writer = response.getWriter();
writer.print(res.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null){
writer.close();
}
}
} @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 { } /**
*
* 描述:用户登录校验
* @author mao2080@sina.com
* @created 2017年5月9日 下午8:27:25
* @since
* @param request
* @throws BusinessException
* @throws IOException
*/
private void userLoginValidate(HttpServletRequest request,HttpServletResponse response) throws BusinessException, IOException {
//校验代码
HttpSession session = request.getSession();
String token =(String) session.getAttribute("token");
if(null==token)
{
return;
}
} /**
*
* 描述:用户权限校验
* @author mao2080@sina.com
* @created 2017年5月4日 下午8:34:09
* @since
* @param request HttpServletRequest
* @param handler
* @return
* @throws BusinessException
*/
private void userAuthValidate(HttpServletRequest request, Object handler) throws BusinessException {
if(handler instanceof HandlerMethod)
{
AuthValidate validate = ((HandlerMethod) handler).getMethodAnnotation(AuthValidate.class);
if(validate == null){
return;//默认权限开放
} String authId = validate.value().getAuthId();
List<String> auths = new ArrayList<String>();//模拟从缓存或者从数据库中查询出对应用户的权限
auths.add("1"); auths.add("5");
if(!auths.contains(authId)){
throw new BusinessException("权限不足");
}
} } }

UserAccessInterceptor

五、配置拦截规则

package cn.com.kamfu.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
// 映射为 user 的控制器下的所有映射
// registry.addInterceptor(new UserAccssInterceptor()).addPathPatterns("/user");
} }

WebMvcConfiguration

六、配置拦截器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <!-- 注解扫描包 -->
<context:component-scan base-package="cn.com.kamfu" /> <!-- 开启注解 -->
<mvc:annotation-driven /> <!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理 -->
<mvc:resources mapping="/images/**" location="/WEB-INF/images/" />
<mvc:resources mapping="/script/**" location="/WEB-INF/script/" />
<mvc:resources mapping="/css/**" location="/WEB-INF/css/" />
<mvc:resources mapping="/html/**" location="/WEB-INF/html/" /> <!-- 定义跳转的文件的前后缀 ,视图模式配置-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
<property name="prefix" value="/WEB-INF/jsp" />
<property name="suffix" value=".jsp" />
</bean>
<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/**" />
<bean class="cn.com.kamfu.interceptor.UserAccessInterceptor"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
</beans>

spring-mvc.xml

七、拦截器的使用

/**
* @Title: UserController.java
* @Package cn.com.kamfu.controller
* @Description: TODO(用一句话描述该文件做什么)
* @author: liandy
* @date: 2019年7月12日 上午2:53:59
* @version V1.0
*/
package cn.com.kamfu.controller; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger;
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.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest; import cn.com.kamfu.auth.AuthCode;
import cn.com.kamfu.auth.AuthValidate;
import cn.com.kamfu.model.User;
import cn.com.kamfu.service.UserService; @Controller
@RequestMapping("/user")
public class UserController { @Autowired
private UserService userService;
protected Logger log = Logger.getLogger(UserController.class); @RequestMapping("/login")
public String login(){ return "/user/login";
}
@RequestMapping("checkUser")
public String checkUser(String name,String password,HttpServletRequest request){
request.getSession().setAttribute("token","token123");
return "redirect:/user/index";
} @AuthValidate(AuthCode.index)
@RequestMapping("/index")
public String index(){
return "/user/index";
} //match automatically
@RequestMapping("/list")
@AuthValidate(AuthCode.userQuery)
public String list(HttpServletRequest request){
// List<User> listUser = userService.findAllUser();
// request.setAttribute("listUser",listUser);
// log.debug("服务器启动了,log4j开始工作了");
// log.error("服务器启动了,log4j开始工作了");
return "/user/list";
} @RequestMapping(value="/pagedList",method=RequestMethod.POST,produces ={"application/json;charset=UTF-8"})
@ResponseBody
public Map<String, Object> pagedList(HttpServletRequest request) throws IOException{
String currentPage=request.getParameter("page");
String pageSize=request.getParameter("rows");
List<User> fList=new ArrayList<User>();
User user=new User();
user.setId(1);
user.setUsername("username");
user.setPassword("password");
fList.add(user);fList.add(user);fList.add(user);fList.add(user);fList.add(user);fList.add(user);fList.add(user);fList.add(user);fList.add(user);fList.add(user);
Map<String, Object> map=new HashMap<String,Object>();
map.put("total", 21);
map.put("rows", fList);
return map; } //boxing automatically
@RequestMapping("/add")
public String add(User user){
System.out.println(user.toString());
return "/user/add";
} //pass the parameters to front-end
@RequestMapping("/showUser")
public String showUser(Map<String,Object> map){
User p =new User();
map.put("p", p); p.setUsername("jack");
return "show";
} //pass the parameters to front-end using ajax
@RequestMapping("/getUser")
public void getPerson(String name,PrintWriter pw){
pw.write("hello,"+name);
} //redirect
@RequestMapping("/redirect")
public String redirect(){
return "redirect:hello";
} @RequestMapping("/file")
public String file(){
return "/file";
}
//文件上传
@RequestMapping(value="/upload",method=RequestMethod.POST)
public String upload(HttpServletRequest req) throws Exception{
MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req;
MultipartFile file = mreq.getFile("file");
String fileName = file.getOriginalFilename();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
FileOutputStream fos = new FileOutputStream(req.getSession().getServletContext().getRealPath("/")+
"upload/"+sdf.format(new Date())+fileName.substring(fileName.lastIndexOf('.')));
fos.write(file.getBytes());
fos.flush();
fos.close(); return "success";
}
}

UserController

springmvc基于注解的权限控制的更多相关文章

  1. 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制

    权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...

  2. Spring Security(17)——基于方法的权限控制

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  3. 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s

     1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2  spring-mv ...

  4. springMVC基于注解的控制器

    springMVC基于注解的控制器 springMVC基于注解的控制器的优点有两个: 1.控制器可以处理多个动作,这就允许将相关操作写在一个类中. 2.控制器的请求映射不需要存储在配置文件中.使用re ...

  5. 后端基于方法的权限控制--Spirng-Security

    后端基于方法的权限控制--Spirng-Security 默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件: ...

  6. Spring Security教程之基于方法的权限控制(十二)

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  7. 在ASP.NET MVC中实现基于URL的权限控制

    本示例演示了在ASP.NET MVC中进行基于URL的权限控制,由于是基于URL进行控制的,所以只能精确到页.这种权限控制的优点是可以在已有的项目上改动极少的代码来增加权限控制功能,和项目本身的耦合度 ...

  8. webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制

    webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...

  9. webapi框架搭建-安全机制(三)-简单的基于角色的权限控制

    webapi框架搭建系列博客 上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使 ...

随机推荐

  1. 【异常】Caused by: java.lang.IllegalStateException: Method has too many Body parameters

    出现此异常原因是引文使用feign客户端的时候,参数没有用注解修饰 1.1GET方式错误写法 @RequestMapping(value="/test", method=Reque ...

  2. 命令 检查Linux服务器性能

    一.uptime命令 这个命令可以快速查看机器的负载情况.在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量.这些数据可以让我们对系统资源使用有一个宏观 ...

  3. 2019牛客多校第三场A Graph Games 分块思想

    题意:给你一张无向图,设s(x)为与x直接相连的点的集合,题目中有两种操作: 1:1 l r 将读入的边的序列中第l个到第r个翻转状态(有这条边 -> 没这条边, 没这条边 -> 有这条边 ...

  4. mybatis 自定义查询语句

    通过mybatis插件生成的mapper文件只有基本的增.删.改.查.汇总.但是实际使用场景中,总是有各种需要连表.汇总.分组查询的需求,那我们一般都通过自定义查询语句去实现. 有时候会有表结构更改的 ...

  5. Vue路由组件vue-router

    一.路由介绍 Creating a Single-page Application with Vue + Vue Router is dead simple. With Vue.js, we are ...

  6. PHP7中异常与错误处理与之前版本对比

    PHP7中异常与错误处理与之前版本对比 先上代码 ECHO PHP_VERSION.PHP_EOL; function add (int $left,int $right){ return $left ...

  7. C语言集成开发环境使用小记

    时隔6年,我又重操C语言,是什么让我如此再下定决心?就是不想让自己所学过的知识就此荒废了,我重新以一个C语言初学者的身份(当然,稍稍有点基础,以前的知识忘得没这么快^_^)温故C语言,学习了几天,果真 ...

  8. 因为看见,所以发现:QBotVariant谢绝落幕

    互联网给人带来便捷的同时,其公开大量的资源也同样给恶意利用者带了便捷,越来越多公开的恶意程序源码降低了对外攻击.入侵的难度,使得安全问题愈加严重. 阿里云安全团队从今年5月份监测到一BOT家族,其样本 ...

  9. PHP filter_id() 函数

    定义和用法 filter_id() 函数返回指定过滤器的 ID 号. 如果成功则返回过滤器的 ID 号,如果过滤器不存在则返回 NULL. 语法 filter_id(filter_name) 参数 描 ...

  10. 【dart学习】-- Dart之异步编程

    一,概述 编程中的代码执行,通常分为同步与异步两种. 同步:简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式.但是同步代码的缺点也显而易见,如果其中某一行或几 ...