springmvc基于注解的权限控制
一、权限码
/**
* @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基于注解的权限控制的更多相关文章
- 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制
权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...
- Spring Security(17)——基于方法的权限控制
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s
1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2 spring-mv ...
- springMVC基于注解的控制器
springMVC基于注解的控制器 springMVC基于注解的控制器的优点有两个: 1.控制器可以处理多个动作,这就允许将相关操作写在一个类中. 2.控制器的请求映射不需要存储在配置文件中.使用re ...
- 后端基于方法的权限控制--Spirng-Security
后端基于方法的权限控制--Spirng-Security 默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件: ...
- Spring Security教程之基于方法的权限控制(十二)
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- 在ASP.NET MVC中实现基于URL的权限控制
本示例演示了在ASP.NET MVC中进行基于URL的权限控制,由于是基于URL进行控制的,所以只能精确到页.这种权限控制的优点是可以在已有的项目上改动极少的代码来增加权限控制功能,和项目本身的耦合度 ...
- webapi框架搭建-安全机制(四)-可配置的基于角色的权限控制
webapi框架搭建系列博客 在上一篇的webapi框架搭建-安全机制(三)-简单的基于角色的权限控制,某个角色拥有哪些接口的权限是用硬编码的方式写在接口上的,如RBAuthorize(Roles = ...
- webapi框架搭建-安全机制(三)-简单的基于角色的权限控制
webapi框架搭建系列博客 上一篇已经完成了“身份验证”,如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使 ...
随机推荐
- js转换成布尔类型boolean
/** * js转换成布尔值 * a.转换方法:Boolean(var) * b.数字转换成布尔,除了0与NaN,其余都是true * c.字符串转换成布尔,除了空串"",其余都是 ...
- day02 html body中的标签
day02 html 一.body中的标签 a标签: <!DOCTYPE html> <html lang="en"> <head> ...
- Flask-sqlalchemy-表关系
表关系 表之间的关系存在三种: 一对一.一对多.多对多. 而SQLAlchemy中的ORM也可以模拟这三种关系.因为一对一其实在SQLAlchemy中底层是通过一对多的方式模拟的, ...
- mysql中级操作
解析sql执行过程 show VARIABLES like '%profil%' //查看是否开启了剖析 如没开启set profiling=1; 启用 show profiles; set @que ...
- Es学习第六课, ES基本搜索_search
前面几课ES的基本概念.安装和分词都讲过了,下面我们就来实战一下ES的核心功能-搜索,这节课我们主要讲的是基本搜索 _search(注意:ES的关键字都要加前缀_,所以我们在定义索引.类型名称时不要带 ...
- RPC服务治理框架(一)RPC技术
一.RPC是什么 remote procedure call:远程过程调用 过程就是程序,像调用本地方法一样调用远程的过程 RPC采用Client-Server结构,通过request-respons ...
- 如何在Mac上将视频刻录到DVD / ISO文件
如果您希望将喜爱的视频转换为DVD / Blu-ray光盘以进行物理备份或播放,则Mac版Wondershare UniConverter可以专业地完成任务.今天的教程就是如何在Mac上轻松刻录DVD ...
- iview下拉树组件
iview.vue.jq等自行引用 iview.js和iview.css版本是iview@3.4.2 <!DOCTYPE html> <html lang="en" ...
- 【Flutter学习】组件通信(父子、兄弟)
一,概述 flutter一个重要的特性就是组件化.组件分为两种状态,一种是StatefulWidget有状态组件,一种是StatelessWidget无状态组件. 无状态组件不能更新状态,有状态组件具 ...
- vue之slot用法
slot元素作为组件模板之中的内容分发插槽.这个元素自身将被替换. 有 name 特性的 slot 称为具名 slot. 有 slot 特性的内容将分发到名字相匹配的具名 slot. 一.单个组件 如 ...