当前位置: 首页 > news >正文

金坛区住房城乡建设局网站项城网站设计

金坛区住房城乡建设局网站,项城网站设计,网站数据库配置,珠宝网站建设平台分析报告【SpringBoot应用篇】【AOP注解】SpringBootSpEL表达式基于注解实现权限控制 Spring SpEL基本表达式类相关表达式表达式模板 SpEL表达式实现权限控制PreAuthAuthFunPreAuthAspectUserControllerSpelParserUtils Spring SpEL Spring 表达式语言 SpEL 是一种非常强大的表达式语言… 【SpringBoot应用篇】【AOP注解】SpringBootSpEL表达式基于注解实现权限控制 Spring SpEL基本表达式类相关表达式表达式模板 SpEL表达式实现权限控制PreAuthAuthFunPreAuthAspectUserControllerSpelParserUtils Spring SpEL Spring 表达式语言 SpEL 是一种非常强大的表达式语言它支持在运行时查询和操作对象图。 它提供了许多高级功能例如方法调用和基本的字符串模板功能。表达式语言给静态Java语言增加了动态功能。 Spring 表达式语言最初是为 Spring 社区创建的它拥有一种受良好支持的表达式语言可用于 Spring 产品组合中的所有产品。 虽然 SpEL 是 Spring 产品组合中表达式评估的基础但它不直接与 Spring 绑定可以独立使用 Spring Security框架中启用prePost注解的支持就是使用SpEL表达式实现的权限控制 PreAuthorize(“hasAuthority(‘save’)”)PreAuthorize(“isAnonymous()”)PreAuthorize(“isAuthenticated()”) SpEL支持如下表达式 基本表达式 字面量表达式、关系逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式类相关表达式 类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用集合相关表达式内联List、内联数组、集合字典访问、列表字典数组修改、集合投影、集合选择不支持多维内联数组初始化不支持内联字典定义其他表达式模板表达式。 注SpEL表达式中的关键字是不区分大小写的。 基本表达式 /** * 基本表达式 : 字面量表达式 */ Test public void test01() {// 1创建解析器SpEL使用ExpressionParser接口表示解析器提供SpelExpressionParser默认实现ExpressionParser parser new SpelExpressionParser();// 2解析表达式使用ExpressionParser的parseExpression来解析相应的表达式为Expression对象。Expression expression parser.parseExpression(12);// 3求值通过Expression接口的getValue方法根据上下文获得表达式值。System.out.println(expression.getValue());String str1 parser.parseExpression(Hello World!).getValue(String.class);int int1 parser.parseExpression(1).getValue(Integer.class);long long1 parser.parseExpression(-1L).getValue(long.class);float float1 parser.parseExpression(1.1).getValue(Float.class);double double1 parser.parseExpression(1.1E2).getValue(double.class);int hex1 parser.parseExpression(0xa).getValue(Integer.class);long hex2 parser.parseExpression(0xaL).getValue(long.class);boolean true1 parser.parseExpression(true).getValue(boolean.class);boolean false1 parser.parseExpression(false).getValue(boolean.class);Object null1 parser.parseExpression(null).getValue(Object.class);System.out.println(str1 str1);System.out.println(int1 int1);System.out.println(long1 long1);System.out.println(float1 float1);System.out.println(double1 double1);System.out.println(hex1 hex1);System.out.println(hex2 hex2);System.out.println(true1 true1);System.out.println(false1 false1);System.out.println(null1 null1); }/** * 基本表达式 : 字面量表达式 */ Test public void test02() {// 1创建解析器SpEL使用ExpressionParser接口表示解析器提供SpelExpressionParser默认实现ExpressionParser parser new SpelExpressionParser();// 2解析表达式使用ExpressionParser的parseExpression来解析相应的表达式为Expression对象。Expression expression parser.parseExpression((Hello World).concat(#end));// 3构造上下文准备比如变量定义等等表达式需要的上下文数据。EvaluationContext context new StandardEvaluationContext();context.setVariable(end, !);// 4求值通过Expression接口的getValue方法根据上下文获得表达式值。System.out.println(expression.getValue(context)); }类相关表达式 Data Component(ss) public class User {private String username;private String address;private Integer age;public String sayHello(String username) {return hello username;}public String sayHello(Integer age) {return hello username ;age age;}public String sayHello() {return hello username;} }/** * 类相关表达式: 变量定义及引用 */ Test public void test03() {String expression #user.username;ExpressionParser parser new SpelExpressionParser();Expression exp parser.parseExpression(expression);StandardEvaluationContext ctx new StandardEvaluationContext();User user new User();user.setAddress(长沙);user.setUsername(zysheep);user.setAge(24);;ctx.setVariable(user, user);String value exp.getValue(ctx, String.class);System.out.println(value value); }Test public void test04() {String expression username;ExpressionParser parser new SpelExpressionParser();Expression exp parser.parseExpression(expression);StandardEvaluationContext ctx new StandardEvaluationContext();User user new User();user.setAddress(长沙);user.setUsername(zysheep);user.setAge(24);// user 对象设置为 rootObject那么表达式中就不需要 #user.ctx.setRootObject(user);String value exp.getValue(ctx, String.class);System.out.println(value value); }/** * 类相关表达式: 对象方法调用 */ Test public void test05() {String expression sayHello(99);ExpressionParser parser new SpelExpressionParser();Expression exp parser.parseExpression(expression);StandardEvaluationContext ctx new StandardEvaluationContext();User user new User();user.setAddress(长沙);user.setUsername(zysheep);user.setAge(24);ctx.setRootObject(user);String value exp.getValue(ctx, String.class);System.out.println(value value); }/** * 类相关表达式: 对象方法调用 * * 调用无参的 sayHello */ Test public void test06() {String expression sayHello();ExpressionParser parser new SpelExpressionParser();Expression exp parser.parseExpression(expression);StandardEvaluationContext ctx new StandardEvaluationContext();User user new User();user.setAddress(长沙);user.setUsername(zysheep);user.setAge(24);ctx.setRootObject(user);String value exp.getValue(ctx, String.class);System.out.println(value value); }/** * 类相关表达式: Bean引用 */ Test public void test07() {// 通过 SpEL 表达式来调用这个名为 ss 的 bean 中的 sayHello 方法String expression ss.sayHello(spel bean引用);ExpressionParser parser new SpelExpressionParser();Expression exp parser.parseExpression(expression);StandardEvaluationContext ctx new StandardEvaluationContext();// 给配置的上下文环境设置一个 bean 解析器这个 bean 解析器会自动跟进名字从 Spring 容器中找打响应的 bean 并执行对应的方法ctx.setBeanResolver(new BeanFactoryResolver(beanFactory));String value exp.getValue(ctx, String.class);System.out.println(value value); }表达式模板 /** * 表达式模板: * 模板表达式就是由字面量与一个或多个表达式块组成。每个表达式块由“前缀表达式后缀”形式组成如“${12}”即表达式块 * */ Test public void test08() {//创建解析器SpelExpressionParser parser new SpelExpressionParser();//创建解析器上下文ParserContext context new TemplateParserContext(%{, });Expression expression parser.parseExpression(你好:%{#name},我们正在学习:%{#lesson}, context);//创建表达式计算上下文EvaluationContext evaluationContext new StandardEvaluationContext();evaluationContext.setVariable(name, zysheep);evaluationContext.setVariable(lesson, SpEL表达式!);//获取值String value expression.getValue(evaluationContext, String.class);System.out.println(value); }SpEL表达式实现权限控制 PreAuth Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) public interface PreAuth {/***** permissionAll()-----只要配置了角色就可以访问* hasPermission(MENU.QUERY)-----有MENU.QUERY操作权限的角色可以访问* permitAll()-----放行所有请求* denyAll()-----只有超级管理员角色才可访问* hasAuth()-----只有登录后才可访问* hasTimeAuth(1,10)-----只有在1-10点间访问* hasRole(‘管理员’)-----具有管理员角色的人才能访问* hasAllRole(‘管理员’,总工程师)-----同时具有管理员、总工程师角色的人才能访问** Spring el* 文档地址https://docs.spring.io/spring/docs/5.1.6.RELEASE/spring-framework-reference/core.html#expressions*/String value();}AuthFun /*** p* 类相关表达式: Bean引用,参数要用单引号包括** PreAuth(af.hasPermission(ADMIN, USER))* /p** author : lyw* since : 2023/11/23 16:01*/ Component(af) public class AuthFun {/*** 判断角色是否具有接口权限** return {boolean}*/public boolean permissionAll() {//TODO 读取数据库权限数据return true;}/*** 判断角色是否具有接口权限** param permission 权限编号,对应菜单的MENU_CODE* return {boolean}*/public boolean hasPermission(String permission) {return hasRole(permission);}/*** 放行所有请求** return {boolean}*/public boolean permitAll() {return true;}/*** 只有超管角色才可访问** return {boolean}*/public boolean denyAll() {return hasRole(ADMIN);}/*** 是否已授权** return {boolean}*/public boolean hasAuth() {return true;}/*** 是否有时间授权** param start 开始时间* param end 结束时间* return {boolean}*/public boolean hasTimeAuth(Integer start, Integer end) {Integer hour DateUtil.hour(new Date(), true);return hour start hour end;}/*** 判断是否有该角色权限** param role 单角色* return {boolean}*/public boolean hasRole(String role) {return hasAnyRole(role);}/*** 判断是否具有所有角色权限** param role 角色集合* return {boolean}*/public boolean hasAllRole(String... role) {for (String r : role) {if (!hasRole(r)) {return false;}}return true;}/*** 判断是否有该角色权限** param role 角色集合* return {boolean}*/public boolean hasAnyRole(String... role) {return Arrays.stream(role).anyMatch(item - StringUtils.equals(ADMIN, item));} }PreAuthAspect Aspect Component public class PreAuthAspect {Autowiredprivate BeanFactory applicationContext;private static final ExpressionParser EXPRESSION_PARSER new SpelExpressionParser();Pointcut(annotation(cn.zysheep.annotation.PreAuth) || within(cn.zysheep.annotation.PreAuth))public void pointcut() {}Around(pointcut())public Object preAuth(ProceedingJoinPoint point) throws Throwable {if (handleAuth(point)) {return point.proceed();}throw new BizException(用户无权限,非法用户!);}private boolean handleAuth(ProceedingJoinPoint point) {MethodSignature ms point.getSignature() instanceof MethodSignature? (MethodSignature) point.getSignature():null;Method method ms.getMethod();// 读取权限注解优先方法上没有则读取类PreAuth preAuth method.getAnnotation( PreAuth.class);// 判断表达式String condition preAuth.value();if (StringUtils.isNotBlank(condition)) {// PreAuth(af.hasPermission(ADMIN, USER))Expression expression EXPRESSION_PARSER.parseExpression(condition);// 方法参数值Object[] args point.getArgs();StandardEvaluationContext context getEvaluationContext(method, args);// 获取解析计算的结果return expression.getValue(context, Boolean.class);}return false;}/*** 获取方法上的参数** param method 方法* param args 变量* return {SimpleEvaluationContext}*/private StandardEvaluationContext getEvaluationContext(Method method, Object[] args) {// 初始化Spel表达式上下文并设置 AuthFunStandardEvaluationContext context new StandardEvaluationContext();// 设置表达式支持spring beancontext.setBeanResolver(new BeanFactoryResolver(applicationContext));// 可以从session中获取登录用户的权限 // for (int i 0; i args.length; i) { // // 读取方法参数 // MethodParameter methodParam ClassUtil.getMethodParameter(method, i); // // 设置方法 参数名和值 为spel变量 // context.setVariable(methodParam.getParameterName(), args[i]); // }return context;} }UserController RestController RequestMapping(/api) Slf4j public class UserController {GetMapping(/save)PreAuth(af.hasPermission(ADMIN))public R save() {log.info(执行保存业务逻辑);return R.success();}GetMapping(/get)PreAuth(af.hasPermission(USER))public R get() {log.info(执行保存业务逻辑);return R.success();}}SpelParserUtils public final class SpelParserUtils {private static final String EXPRESSION_PREFIX #{;private static final String EXPRESSION_SUFFIX };/*** 表达式解析器*/private static ExpressionParser expressionParser new SpelExpressionParser();/*** 参数名解析器用于获取参数名*/private static DefaultParameterNameDiscoverer parameterNameDiscoverer new DefaultParameterNameDiscoverer();private SpelParserUtils(){}/*** 解析spel表达式** param method 方法* param args 参数值* param spelExpression 表达式* param clz 返回结果的类型* param defaultResult 默认结果* return 执行spel表达式后的结果*/public static T T parse(Method method, Object[] args, String spelExpression, ClassT clz, T defaultResult) {String[] params parameterNameDiscoverer.getParameterNames(method);EvaluationContext context new StandardEvaluationContext();//设置上下文变量for (int i 0; i params.length; i) {context.setVariable(params[i], args[i]);}T result getResult(context,spelExpression,clz);if(Objects.isNull(result)){return defaultResult;}return result;}/*** 解析spel表达式** param method 方法* param args 参数值* param spelExpression 表达式* param clz 返回结果的类型* return 执行spel表达式后的结果*/public static T T parse(Method method, Object[] args, String spelExpression, ClassT clz) {String[] params parameterNameDiscoverer.getParameterNames(method);EvaluationContext context new StandardEvaluationContext();//设置上下文变量for (int i 0; i params.length; i) {context.setVariable(params[i], args[i]);}return getResult(context,spelExpression,clz);}/*** 解析spel表达式** param param 参数名* param paramValue 参数值* param spelExpression 表达式* param clz 返回结果的类型* return 执行spel表达式后的结果*/public static T T parse(String param, Object paramValue, String spelExpression, ClassT clz) {EvaluationContext context new StandardEvaluationContext();//设置上下文变量context.setVariable(param, paramValue);return getResult(context,spelExpression,clz);}/*** 解析spel表达式** param param 参数名* param paramValue 参数值* param spelExpression 表达式* param clz 返回结果的类型* param defaultResult 默认结果* return 执行spel表达式后的结果*/public static T T parse(String param, Object paramValue,String spelExpression, ClassT clz, T defaultResult) {EvaluationContext context new StandardEvaluationContext();//设置上下文变量context.setVariable(param, paramValue);T result getResult(context,spelExpression,clz);if(Objects.isNull(result)){return defaultResult;}return result;}/*** 获取spel表达式后的结果** param context 解析器上下文接口* param spelExpression 表达式* param clz 返回结果的类型* return 执行spel表达式后的结果*/private static T T getResult(EvaluationContext context,String spelExpression, ClassT clz){try {//解析表达式Expression expression parseExpression(spelExpression);//获取表达式的值return expression.getValue(context, clz);} catch (Exception e) {log.error(e.getMessage(),e);}return null;}/*** 解析表达式* param spelExpression spel表达式* return*/private static Expression parseExpression(String spelExpression){// 如果表达式是一个#{}表达式需要为解析传入模板解析器上下文if(spelExpression.startsWith(EXPRESSION_PREFIX) spelExpression.endsWith(EXPRESSION_SUFFIX)){return expressionParser.parseExpression(spelExpression,new TemplateParserContext());}return expressionParser.parseExpression(spelExpression);}}
文章转载自:
http://www.morning.nfcxq.cn.gov.cn.nfcxq.cn
http://www.morning.jqlx.cn.gov.cn.jqlx.cn
http://www.morning.xwlhc.cn.gov.cn.xwlhc.cn
http://www.morning.jjxnp.cn.gov.cn.jjxnp.cn
http://www.morning.qtsks.cn.gov.cn.qtsks.cn
http://www.morning.ggjlm.cn.gov.cn.ggjlm.cn
http://www.morning.shuangxizhongxin.cn.gov.cn.shuangxizhongxin.cn
http://www.morning.wjlnz.cn.gov.cn.wjlnz.cn
http://www.morning.lwmzp.cn.gov.cn.lwmzp.cn
http://www.morning.sxtdh.com.gov.cn.sxtdh.com
http://www.morning.lcqrf.cn.gov.cn.lcqrf.cn
http://www.morning.aiai201.cn.gov.cn.aiai201.cn
http://www.morning.yslfn.cn.gov.cn.yslfn.cn
http://www.morning.jfbpf.cn.gov.cn.jfbpf.cn
http://www.morning.jyknk.cn.gov.cn.jyknk.cn
http://www.morning.sbrjj.cn.gov.cn.sbrjj.cn
http://www.morning.zwdrz.cn.gov.cn.zwdrz.cn
http://www.morning.xnfg.cn.gov.cn.xnfg.cn
http://www.morning.mqmxg.cn.gov.cn.mqmxg.cn
http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn
http://www.morning.wrqw.cn.gov.cn.wrqw.cn
http://www.morning.fycjx.cn.gov.cn.fycjx.cn
http://www.morning.zxxys.cn.gov.cn.zxxys.cn
http://www.morning.lgnrl.cn.gov.cn.lgnrl.cn
http://www.morning.fpyll.cn.gov.cn.fpyll.cn
http://www.morning.zlnmm.cn.gov.cn.zlnmm.cn
http://www.morning.fsjcn.cn.gov.cn.fsjcn.cn
http://www.morning.xnltz.cn.gov.cn.xnltz.cn
http://www.morning.qfwzm.cn.gov.cn.qfwzm.cn
http://www.morning.nzqqd.cn.gov.cn.nzqqd.cn
http://www.morning.kjmws.cn.gov.cn.kjmws.cn
http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn
http://www.morning.jzyfy.cn.gov.cn.jzyfy.cn
http://www.morning.rryny.cn.gov.cn.rryny.cn
http://www.morning.pmptm.cn.gov.cn.pmptm.cn
http://www.morning.zrhhb.cn.gov.cn.zrhhb.cn
http://www.morning.prgdy.cn.gov.cn.prgdy.cn
http://www.morning.dwxqf.cn.gov.cn.dwxqf.cn
http://www.morning.cfcdr.cn.gov.cn.cfcdr.cn
http://www.morning.hxhrg.cn.gov.cn.hxhrg.cn
http://www.morning.prjns.cn.gov.cn.prjns.cn
http://www.morning.lfbzg.cn.gov.cn.lfbzg.cn
http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn
http://www.morning.rbjth.cn.gov.cn.rbjth.cn
http://www.morning.bnmfq.cn.gov.cn.bnmfq.cn
http://www.morning.jyknk.cn.gov.cn.jyknk.cn
http://www.morning.yrblz.cn.gov.cn.yrblz.cn
http://www.morning.lrnfn.cn.gov.cn.lrnfn.cn
http://www.morning.kwqqs.cn.gov.cn.kwqqs.cn
http://www.morning.bmncq.cn.gov.cn.bmncq.cn
http://www.morning.rkfgx.cn.gov.cn.rkfgx.cn
http://www.morning.bgxgq.cn.gov.cn.bgxgq.cn
http://www.morning.xflzm.cn.gov.cn.xflzm.cn
http://www.morning.pxtgf.cn.gov.cn.pxtgf.cn
http://www.morning.ghccq.cn.gov.cn.ghccq.cn
http://www.morning.ghxsn.cn.gov.cn.ghxsn.cn
http://www.morning.rtryr.cn.gov.cn.rtryr.cn
http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn
http://www.morning.nsmyj.cn.gov.cn.nsmyj.cn
http://www.morning.junmap.com.gov.cn.junmap.com
http://www.morning.qwyms.cn.gov.cn.qwyms.cn
http://www.morning.nbrdx.cn.gov.cn.nbrdx.cn
http://www.morning.sjgsh.cn.gov.cn.sjgsh.cn
http://www.morning.phxdc.cn.gov.cn.phxdc.cn
http://www.morning.mcndn.cn.gov.cn.mcndn.cn
http://www.morning.xmjzn.cn.gov.cn.xmjzn.cn
http://www.morning.kwpnx.cn.gov.cn.kwpnx.cn
http://www.morning.sfyqs.cn.gov.cn.sfyqs.cn
http://www.morning.cnqwn.cn.gov.cn.cnqwn.cn
http://www.morning.bgpb.cn.gov.cn.bgpb.cn
http://www.morning.dwdjj.cn.gov.cn.dwdjj.cn
http://www.morning.btlmb.cn.gov.cn.btlmb.cn
http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn
http://www.morning.ie-comm.com.gov.cn.ie-comm.com
http://www.morning.jyzxt.cn.gov.cn.jyzxt.cn
http://www.morning.routalr.cn.gov.cn.routalr.cn
http://www.morning.ypfw.cn.gov.cn.ypfw.cn
http://www.morning.wfzlt.cn.gov.cn.wfzlt.cn
http://www.morning.nqwkn.cn.gov.cn.nqwkn.cn
http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn
http://www.tj-hxxt.cn/news/243392.html

相关文章:

  • 适合网站开发的浏览器公司提供平台
  • icp备案网站名称更改wordpress 自动退出
  • 用户体验设计专业广东网站seo
  • 网站后台从哪里进去如何再腾讯云服务器做网站
  • 网站 系统概述如何做jquery音乐网站
  • 网站建设的7个基本流程网站网站做维护
  • 外链网站分类手机网站建设教程
  • 厦门网站的制作深圳网站建设方维网络
  • 中山快速做网站公司关于企业网站建设的市场比质比价调查报告
  • 网站如何才能被百度收录网站后期维护合同
  • 网站首页原型图怎么做成都做网络推广的公司有哪些
  • 安徽省建设造价管理协会网站服务公司注册资金多少合适
  • 腾讯云建站网站建设面试题
  • wordpress国外网站江西南昌网站建设哪家公司好
  • 深圳建外贸网站电子商务网站建设前期
  • 网站被k 原因静态网站的好处就是安全性好从而
  • 方寸网站建设网站移动排名
  • 微信网站是多少深圳宝安高端网站建设公司
  • 上饶做网站最好的公司网站优化可以自己做么
  • 申请免费网站建设泰安中推网络科技有限公司
  • 网站必须备案吗视觉中国网站建设公司
  • 沈阳思路网站制作最新章节 62.一起来做网站吧
  • flash网站项目背景明港网站建设
  • 网页设计网站长沙王也天与葛优
  • 成都龙泉建设有限公司网站汕头集团做网站方案
  • 百度站长平台网页版nginx wordpress
  • 网站建设方案设计室内装修效果图大全2023图片
  • 注册网站给谁交钱北京网页设计公司兴田德润挺好
  • 响应式网站开发框架遵义做网站的公司
  • 杭州网站建设培训学校wordpress分类目录单个调用