首页 文章 精选 留言 我的

精选列表

搜索[垂直整合],共10009篇文章
优秀的个人博客,低调大师

SpringBoot2整合Thymeleaf,官方推荐html解决方案

前言 什么是Thymeleaf Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 -HTML可以在浏览器中正确显示,也可以作为静态原型工作,从而可以在开发团队中加强协作。 Thymeleaf拥有适用于Spring Framework的模块,与您喜欢的工具的大量集成以及插入您自己的功能的能力,对于现代HTML5 JVM Web开发而言,Thymeleaf是理想的选择-尽管它还有很多工作要做。 Thymeleaf和Freemarker对比 Thymeleaf优点: 静态html嵌入标签属性,浏览器可以直接打开模板文件,便于前后端联调。springboot官方推荐方案。 Thymeleaf缺点: 模板必须符合xml规范,就这一点就可以判死刑!太不方便了!js脚本必须加入/<!\[CDATA\[/标识,否则一个&符号就会导致后台模板合成抛异常,而且错误信息巨不友好,害得我调试了好几个小时才明白是怎么回事。js里面还好办,这样是在html里面含有&等符号,还需要转义?忒麻烦了! 就上面一条就够了 Freemarker优点: 1、通用目标 能够生成各种文本:HTML、XML、RTF、Java源代码等等 易于嵌入到你的产品中:轻量级:不需要Serve环境 插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等 你可以按你所需生成文本:保存到本地文件;作为Ema发送;从Web应用程序发送它返回给Web浏览器 2、强大的模板语言 所有常用的指令:include、if/ elseif/else、循环结构 在模板中创建和改变变量 几乎在任何地方都可以使用复杂表达式来指定值 命名的宏,可以具有位置参数和嵌套内容 名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突 输岀转换块∶在嵌套模板片段生成输岀时,转换HM转义、压缩、语法高亮等等;你可以定义自己的转换 3、通用数据模型 FreeMarker不是直接反射到Java对象,Jva对象通过插件式对象封装,以变量方式在模板中显示 你可以使用抽象(接口)方式表示对象( Java bean、XM文档、sL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰 4、为Web准备 在模板语言中内建处理典型Web相关任务(如HTML转义)的结构 能够集成到Mode2Web应用框架中作为JsP的 支持JSP标记库 为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员 5、智能的国际化和本地化 字符集智能化(内部使用UNICODE) 数字格式本地化敏感 日期和时间格式本地化敏感 非Us字符集可以用作标识(如变量名) 多种不同语言的相同模板 6、强大的XML处理能力 <#recurse> 和<#visit>指令(2.3版本)用于递归遍历XML树 Freemarker缺点: 暂时未发现 说明 好像通过上面的对比Thymeleaf好像没有占多大的便宜,但是也架不住老板说要用Thymeleaf,因此本文还是讲解下如何在程序中配置Thymeleaf模板解析引擎 编码 1.添加Thymeleaf的Jar包 编辑pom.xml添加 xml 复制代码 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 注:若之前有使用其他模板解析引擎请先删除下配置 2.配置SpringBoot的application.properties文件 添加 sh 复制代码 #Thymeleaf配置 # spring.thymeleaf.cache : 是否启用缓存 # spring.thymeleaf.check-template : 在展示前检查模板是否存在 # spring.thymeleaf.check-template-location : 检查模板位置是否存在 # spring.thymeleaf.encoding : 模板文件编码 # spring.thymeleaf.mode : 模板模式 # spring.thymeleaf.prefix : 模板文件路径前缀 # spring.thymeleaf.reactive.max-chunk-size : 模板可使用的最大缓冲区 # spring.thymeleaf.servlet.content-type : 模板内容类型 # spring.thymeleaf.suffix : 模板文件后缀 spring.thymeleaf.cache=false spring.thymeleaf.check-template=true spring.thymeleaf.check-template-location=true spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.mode=HTML5 spring.thymeleaf.prefix=classpath:/static/views/ spring.thymeleaf.reactive.max-chunk-size=0 spring.thymeleaf.servlet.content-type=text/html spring.thymeleaf.suffix=.html 3.创建HTML模板 在resources/static/views编写一个Thymeleaf模板的html页面 新建一个thymeleaf.html html 复制代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <title>index</title> </head> <body> hello Thymeleaf </body> </html> 4.编写Controller方法 新建一个ThymeleafController.java java 复制代码 package org.xujun.springboot.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.ModelAndView; @RestController public class ThymeleafController { @GetMapping("thymeleaf") public ModelAndView thymeleaf() { ModelAndView mv = new ModelAndView(); mv.setViewName("thymeleaf"); return mv; } } 注:其中mv.setViewName("thymeleaf");中thymeleaf为模板的名字,因为前缀后缀在配置文件中已经配置,所以在此配置模板名字即可 5.测试 运行项目,并且访问[http://127.0.0.1:8080/thymeleaf] 总结:个人对thymeleaf其实无感,用过一段时间,感觉非常难受。因此还是奔向Freemarker的怀抱。但是对于技术而言,它会改变。因此我们还是要掌握它。本文讲解了SpringBoot框架配置thymeleaf,并没有详细讲解thymeleaf模板的用法。因为这里主要讲解Springboot框架。后续的文章会对该模板语法做详细的讲解。

优秀的个人博客,低调大师

Apache ftpserver整合springboot

Apache ftpserver集成 Apache ftpserver由Java语言开发的Ftp服务器,集成到其它程序,正常运行需要: mina-core, 2.0-M3 or later slf4j-api A SLF4J implementation of your choice, for example slf4j-simple-1.5.3.jar ftplet-api ftpserver-core <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25 </version> </dependency> <dependency> <groupId>org.apache.ftpserver</groupId> <artifactId>ftpserver-core</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.apache.ftpserver</groupId> <artifactId>ftplet-api</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId> <version>2.0.16</version> </dependency> Springboot应用集成 Apache ftpserver 代码 @Configuration public class FtpConfig { private final Logger logger = LoggerFactory.getLogger(FtpConfig.class); @Bean public UserManager getUserManger() throws FtpException { FtpServerFactory serverFactory = new FtpServerFactory(); // ftp服务监听的端口号 ListenerFactory factory = new ListenerFactory(); factory.setPort(2221); serverFactory.addListener("default", factory.createListener()); // 创建用户 BaseUser user = new BaseUser(); user.setName("admin"); user.setPassword("123456"); user.setHomeDirectory("E:\\FTPServerPath"); List<Authority> authorities = new ArrayList<Authority>(); authorities.add(new WritePermission()); user.setAuthorities(authorities); UserManager userManager = serverFactory.getUserManager(); userManager.save(user); serverFactory.setUserManager(userManager); FtpServer server = serverFactory.createServer(); server.start(); logger.info("ftp已经启动!"); return userManager; } } @Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(SpringUtil.applicationContext == null) { SpringUtil.applicationContext = applicationContext; } } //SpringUtils.getApplicationContext()获取applicationContext对象 public static ApplicationContext getApplicationContext() { return applicationContext; } public static Object getBean(String name){ return getApplicationContext().getBean(name); } public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }

优秀的个人博客,低调大师

Spring Boot 整合 Quartz

配置 pom Spring Boot 使用的是2.1.6.RELEASE,依赖中增加如下配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> application.properties 调度器可以和springboot公用数据源 #使用数据库固化调度信息 spring.quartz.job-store-type=jdbc #调度器名称 spring.quartz.scheduler-name=MyScheduler #不重新创建数据表 spring.quartz.jdbc.initialize-schema=never #线程数量 spring.quartz.properties.org.quartz.threadPool.threadCount = 50 #持久化实现 spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX #数据库方言StdJDBCDelegate spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate java代码 任务:实现Job接口即可 public interface Job { //context中包含当前任务关联的信息 //JobExecutionException 当任务执行失败时可以通过配置来控制是否继续执行等操作 void execute(JobExecutionContext context) throws JobExecutionException; } 调度器:在service中注入Scheduler即可,Scheduler是调度器整体管理包括暂停任务,更新任务,恢复任务等 需求以及解决方法 每个任务使用相同上下文即JobData继承Job的java类上增加@PersistJobDataAfterExecution,@DisallowConcurrentExecution注解,通常这两个注解配合使用 @PersistJobDataAfterExecution:在任务执行后固化JobData至数据库 @DisallowConcurrentExecution:避免同一个组的同一个任务并发执行以免JobData混乱 更新JobData至当前任务 //jobDetail 任务信息 JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(job.getName(), job.getGroup())); jobDetail.getJobDataMap().put("aaa", "bbb"); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(TriggerKey.triggerKey(job.getName(), job.getGroup())); Set<Trigger> triggers = new HashSet<>(); triggers.add(trigger); //true 就是替换数据库中JobDataMap scheduler.scheduleJob(jobDetail,triggers,true); 任务控制 暂停任务:scheduler.pauseJob(jobKey) 恢复任务:scheduler.resumeJob(jobKey) 立即执行任务:scheduler.triggerJob(jobKey) 执行中的任务: List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs() //获取具体任务信息 JobDetail jobDetail = executingJob.getJobDetail(); 查询任务 //依据分组查询,如需其他查找查看api中实现了org.quartz.Matcher接口的类即可 GroupMatcher<JobKey> matcher = GroupMatcher.groupContains(groupKeyword); Set<JobKey> jobKeys = scheduler.getJobKeys(matcher); //通过JobKey获取调度器中具体任务以及相关信息 scheduler.getJobDetail(jobKey); 参考资料 https://eelve.com/archives/springbootstarterquartzs http://www.quartz-scheduler.org/ https://www.w3cschool.cn/quartz_doc/

优秀的个人博客,低调大师

Spring Boot 整合 elk

一、elk 简介 Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。 Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。 二、elk的安装 我们采用的 docker 镜像安装。 #下载镜像 docker pull sebp/elk #启动镜像 , 指定es的内存 docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 5601:5601 -p 5044:5044 -p 9200:9200 -p 9300:9300 -it --name elk 2fbf0a30426d 需要修改 logstash 配置,新建命令窗口,进行下面的docker命令 #通过exec命令进入容器 docker exec -it elk /bin/bash 进入容器后,修改 /etc/logstash/conf.d/02-beats-input.conf input { tcp { port => 5044 codec => json_lines } } output{ elasticsearch { hosts => ["localhost:9200"] } } 保存后,我们使用 control + P + Q 退出容器。然后重启容器,让我们的配置生效。 docker restart elk 我们访问http://127.0.0.1:5601 三、创建工程 创建工程springboot-elk ,并使用logback 记录日志。 1. pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gf</groupId> <artifactId>springboot-elk</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-elk</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- logback --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>5.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build> </project> 2. 启动类 @RestController @SpringBootApplication public class SpringbootElkApplication { private final static Logger logger = LoggerFactory.getLogger( SpringbootElkApplication.class ); public static void main(String[] args) { SpringApplication.run(SpringbootElkApplication.class, args); } @GetMapping("/{name}") public String hi(@PathVariable(value = "name") String name) { logger.info( "name = {}" , name ); return "hi , " + name; } } 3. logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> <!--该日志将日志级别不同的log信息保存到不同的文件中 --> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <springProperty scope="context" name="springAppName" source="spring.application.name" /> <!-- 日志在工程中的输出位置 --> <property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}" /> <!-- 控制台的日志输出样式 --> <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" /> <!-- 控制台输出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!-- 日志输出编码 --> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> <!-- 为logstash输出的JSON格式的Appender --> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>127.0.0.1:5044</destination> <!-- 日志输出编码 --> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <timestamp> <timeZone>UTC</timeZone> </timestamp> <pattern> <pattern> { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } </pattern> </pattern> </providers> </encoder> </appender> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="console" /> <appender-ref ref="logstash" /> </root> </configuration> 启动工程,日志会存入elasticsearch中,通过Kibana 的web界面,配置后,我们就可看到,下面我简单的修改下配置。 三、配置 pattern 配置 pattern 输入*,匹配所有数据。 选择时间@timestamp,这样数据展示会以时间排序 好了 ,点击discover,就可以看到我们springboot-elk项目的日志信息了。 源码下载: https://github.com/gf-huanchupk/SpringBootLearning

优秀的个人博客,低调大师

Spark整合Mongodb[转]

环境准备 mongodb下载 解压安装 启动mongodb服务 $MONGODB_HOME/bin/mongod--fork--dbpath=/root/data/mongodb/--logpath=/root/data/log/mongodb/mongodb.log pom依赖 org.mongodb.spark mongo-spark-connector_2.11 ${spark.version} 实例代码 objectConnAppTest{ defmain(args:Array[String]):Unit={ valspark=SparkSession.builder() .master("local[2]") .appName("ConnAppTest") .config("spark.mongodb.input.uri","mongodb://192.168.31.136/testDB.testCollection")//指定mongodb输入 .config("spark.mongodb.output.uri","mongodb://192.168.31.136/testDB.testCollection")//指定mongodb输出 .getOrCreate() //生成测试数据 valdocuments=spark.sparkContext.parallelize((1to10).map(i=>Document.parse(s"{test:$i}"))) //存储数据到mongodb MongoSpark.save(documents) //加载数据 valrdd=MongoSpark.load(spark) //打印输出 rdd.show } } 原文链接:http://blog.csdn.net/soul_code/article/details/78523140

优秀的个人博客,低调大师

spring boot整合shiro

一、需要的依赖包 <!--shiro的版本--> <properties> <org.apache.shiro.version>1.3.2</org.apache.shiro.version> </properties> <!--shiro--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>${org.apache.shiro.version}</version> /dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>${org.apache.shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${org.apache.shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>${org.apache.shiro.version}</version> </dependency> 二、添加ehcache <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPExml> <ehcacheupdateCheck="false"name="shiroCache"> <!--http://ehcache.org/ehcache.xml--> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" /> <!--登录记录缓存锁定10分钟--> <cachename="passwordRetryCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="1800" overflowToDisk="false" statistics="true"> </cache> <cachename="authorizationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cachename="authenticationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cachename="shiro-activeSessionCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache> 三、创建一个realm publicclassShiroRealmextendsAuthorizingRealm{ @Autowired privateUserBizbiz; @Override protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ //获取用户权限 SimpleAuthorizationInfoauthorizationInfo=newSimpleAuthorizationInfo(); authorizationInfo.setRoles(角色集合); authorizationInfo.setStringPermissions(权限集合); returnauthorizationInfo; } @Override protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{ returnnewSimpleAuthenticationInfo(获取到的用户账号, 获取到的用户密码,ByteSource.Util.bytes(user.getUserNo()+Constants.token.salt),getName()); } } 四、添加验证器 publicclassPlatFormCredentialsMatcherextendsHashedCredentialsMatcher{ @Autowired privateUserServiceservice; @Autowired privateEhCacheManagershiroEhcacheManager; @Override publicbooleandoCredentialsMatch(AuthenticationTokentoken,AuthenticationInfoinfo){ Cache<String,AtomicInteger>passwordRetryCache=shiroEhcacheManager.getCache("passwordRetryCache"); Stringuserno=(String)token.getPrincipal(); //retrycount+1 AtomicIntegerretryCount=passwordRetryCache.get(userno); if(retryCount==null){ retryCount=newAtomicInteger(0); passwordRetryCache.put(userno,retryCount); } if(retryCount.incrementAndGet()>5){ //ifretrycount>5throw thrownewExcessiveAttemptsException(); } booleanmatches=super.doCredentialsMatch(token,info); if(matches){ //clearretrycount passwordRetryCache.remove(userno); Result<User>userResult=service.findByUserNo(userno); //根据登录名查询用户 Subjectsubject=SecurityUtils.getSubject(); Sessionsession=subject.getSession(); session.setAttribute("user",userResult.getResultData()); } returnmatches; } } 五、添加shiro配置 @Configuration publicclassShiroConfiguration{ privatestaticMap<String,String>filterChainDefinitionMap=newLinkedHashMap<String,String>(); @Bean(name="ShiroRealm") publicShiroRealmgetShiroRealm(@Qualifier("credentialsMatcher")CredentialsMatchermatcher){ ShiroRealmshiroRealm=newShiroRealm(); shiroRealm.setCredentialsMatcher(matcher); returnshiroRealm; } @Bean(name="shiroEhcacheManager") publicEhCacheManagergetEhCacheManager(){ EhCacheManagerem=newEhCacheManager(); em.setCacheManagerConfigFile("classpath:ehcache/ehcache-shiro.xml"); returnem; } @Bean(name="credentialsMatcher") publicPlatFormCredentialsMatchergetCredentialsMatcher(){ PlatFormCredentialsMatcherplatFormCredentialsMatcher=newPlatFormCredentialsMatcher(); platFormCredentialsMatcher.setHashAlgorithmName("MD5"); platFormCredentialsMatcher.setHashIterations(2); platFormCredentialsMatcher.setStoredCredentialsHexEncoded(true); returnplatFormCredentialsMatcher; } @Bean(name="lifecycleBeanPostProcessor") publicLifecycleBeanPostProcessorgetLifecycleBeanPostProcessor(){ returnnewLifecycleBeanPostProcessor(); } @Bean publicDefaultAdvisorAutoProxyCreatorgetDefaultAdvisorAutoProxyCreator(){ DefaultAdvisorAutoProxyCreatordaap=newDefaultAdvisorAutoProxyCreator(); daap.setProxyTargetClass(true); returndaap; } @Bean(name="securityManager") publicDefaultWebSecurityManagergetDefaultWebSecurityManager(@Qualifier("ShiroRealm")ShiroRealmshiroRealm){ DefaultWebSecurityManagerdwsm=newDefaultWebSecurityManager(); dwsm.setRealm(shiroRealm); dwsm.setCacheManager(getEhCacheManager()); returndwsm; } @Bean publicAuthorizationAttributeSourceAdvisorgetAuthorizationAttributeSourceAdvisor(@Qualifier("securityManager")DefaultWebSecurityManagerdwsm){ AuthorizationAttributeSourceAdvisoraasa=newAuthorizationAttributeSourceAdvisor(); aasa.setSecurityManager(dwsm); returnnewAuthorizationAttributeSourceAdvisor(); } @Bean(name="shiroFilter") publicShiroFilterFactoryBeangetShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManagerdwsm){ ShiroFilterFactoryBeanshiroFilterFactoryBean=newShiroFilterFactoryBean(); shiroFilterFactoryBean .setSecurityManager(dwsm); shiroFilterFactoryBean.setLoginUrl("/login"); shiroFilterFactoryBean.setSuccessUrl("/admin/index"); shiroFilterFactoryBean.setUnauthorizedUrl("/login"); filterChainDefinitionMap.put("/login","authc"); filterChainDefinitionMap.put("/BJUI/**","anon"); filterChainDefinitionMap.put("/platform/**","anon"); filterChainDefinitionMap.put("/admin/course/category/list","perms[user:view]"); filterChainDefinitionMap.put("/admin/course/category/edit","perms[user:update]"); filterChainDefinitionMap.put("/admin/course/category/update","perms[user:update]"); filterChainDefinitionMap.put("/admin/course/category/add","perms[user:add]"); filterChainDefinitionMap.put("/admin/**","anon"); shiroFilterFactoryBean .setFilterChainDefinitionMap(filterChainDefinitionMap); returnshiroFilterFactoryBean; } /** *FilterRegistrationBean *@return */ @Bean publicFilterRegistrationBeanfilterRegistrationBean(){ FilterRegistrationBeanfilterRegistration=newFilterRegistrationBean(); filterRegistration.setFilter(newDelegatingFilterProxy("shiroFilter")); filterRegistration.setEnabled(true); filterRegistration.addUrlPatterns("/*"); filterRegistration.setDispatcherTypes(DispatcherType.REQUEST); returnfilterRegistration; } }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册