使用JavaConfig的SpringMVC4 + Spring Data JPA + SpringSecurity配置

在本文中,我们将看到如何使用JavaConfig配置和集成SpringMVC4,带有Hibernate的Spring Data JPA和SpringSecurity。

1.首先让我们在pom.xml中配置所有必要的依赖项

<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.sivalabs</groupId><artifactId>spring-javaconfig</artifactId><version>1.0</version><packaging>war</packaging><name>SpringApp JavaConfig Demo</name><properties><java.version>1.7</java.version><junit.version>4.11</junit.version><slf4j.version>1.7.5</slf4j.version><logback.version>1.0.13</logback.version><spring.version>4.0.0.RELEASE</spring.version><spring-data-jpa.version>1.4.1.RELEASE</spring-data-jpa.version><spring-security.version>3.2.0.RELEASE</spring-security.version><hibernate.version>4.2.6.Final</hibernate.version><aspectj.version>1.7.2</aspectj.version><mysql.version>5.1.26</mysql.version><jackson-json.version>2.3.1</jackson-json.version><commons-dbcp.version>1.2.2</commons-dbcp.version><commons-lang3.version>3.1</commons-lang3.version></properties><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin></plugins></build><dependencies><!-- Logging dependencies --><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>${logback.version}</version></dependency>		<!-- Spring dependencies --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><!-- Spring Data JPA dependencies --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>${spring-data-jpa.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency><!-- SpringSecurity dependencies --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId><version>${spring-security.version}</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>${spring-security.version}</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>${spring-security.version}</version></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-taglibs</artifactId><version>${spring-security.version}</version></dependency>	<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectj.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>${aspectj.version}</version></dependency>	<!-- Testing dependencies --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency>		<!-- DB dependencies --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>${commons-dbcp.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson-json.version}</version></dependency><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.3</version></dependency><!-- Web dependencies --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version><scope>compile</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version><scope>compile</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-framework-bom</artifactId><version>${spring.version}</version><type>pom</type><scope>import</scope></dependency>		</dependencies></dependencyManagement></project>

2.在application.properties中配置数据库连接属性和电子邮件设置

################### DataSource Configuration ##########################jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=admininit-db=false################### Hibernate Configuration ##########################hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update################### JavaMail Configuration ##########################
smtp.host=smtp.gmail.com
smtp.port=465
smtp.protocol=smtps
smtp.username=sivaprasadreddy.k@gmail.com
smtp.password=
support.email=sivaprasadreddy.k@gmail.com

3.在com.sivalabs.springapp.config.AppConfig.java中配置公共服务层bean,例如PropertySourcesPlaceholderConfigurerJavaMailSender等。

package com.sivalabs.springapp.config;import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.scheduling.annotation.EnableScheduling;@Configuration
@ComponentScan(basePackages={"com.sivalabs.springapp"},excludeFilters=@ComponentScan.Filter(type=FilterType.REGEX, pattern={"com.sivalabs.springapp.web.*"}))
@PropertySource(value = { "classpath:application.properties" })
@EnableScheduling
@EnableAspectJAutoProxy
@EnableCaching
public class AppConfig 
{@Autowiredprivate Environment env;@Beanpublic static PropertySourcesPlaceholderConfigurer placeHolderConfigurer(){return new PropertySourcesPlaceholderConfigurer();}@Beanpublic JavaMailSenderImpl javaMailSenderImpl() {JavaMailSenderImpl mailSenderImpl = new JavaMailSenderImpl();mailSenderImpl.setHost(env.getProperty("smtp.host"));mailSenderImpl.setPort(env.getProperty("smtp.port", Integer.class));mailSenderImpl.setProtocol(env.getProperty("smtp.protocol"));mailSenderImpl.setUsername(env.getProperty("smtp.username"));mailSenderImpl.setPassword(env.getProperty("smtp.password"));Properties javaMailProps = new Properties();javaMailProps.put("mail.smtp.auth", true);javaMailProps.put("mail.smtp.starttls.enable", true);mailSenderImpl.setJavaMailProperties(javaMailProps);return mailSenderImpl;}@Beanpublic CacheManager cacheManager(){return new ConcurrentMapCacheManager();}
}

观察到我们已经使用新的REGEX excludeFilter类型从组件扫描中排除了软件包“ com.sivalabs.springapp.web。* ”。

如果我们不排除与Web相关的软件包,并尝试对服务层bean运行JUnit测试,我们将遇到以下异常:

java.lang.IllegalArgumentException:需要ServletContext来配置默认的Servlet处理

还要注意,我们已经使用@EnableCaching启用了缓存,因此我们应该声明CacheManager bean。

4.在com.sivalabs.springapp.config.PersistenceConfig.java中配置持久层bean,如下所示:

package com.sivalabs.springapp.config;import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.orm.hibernate4.HibernateExceptionTranslator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages="com.sivalabs.springapp.repositories")
public class PersistenceConfig 
{@Autowiredprivate Environment env;@Value("${init-db:false}")private String initDatabase;@Beanpublic PlatformTransactionManager transactionManager(){EntityManagerFactory factory = entityManagerFactory().getObject();return new JpaTransactionManager(factory);}@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory(){LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();vendorAdapter.setGenerateDdl(Boolean.TRUE);vendorAdapter.setShowSql(Boolean.TRUE);factory.setDataSource(dataSource());factory.setJpaVendorAdapter(vendorAdapter);factory.setPackagesToScan("com.sivalabs.springapp.entities");Properties jpaProperties = new Properties();jpaProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));factory.setJpaProperties(jpaProperties);factory.afterPropertiesSet();factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());return factory;}@Beanpublic HibernateExceptionTranslator hibernateExceptionTranslator(){return new HibernateExceptionTranslator();}@Beanpublic DataSource dataSource(){BasicDataSource dataSource = new BasicDataSource();dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));dataSource.setUrl(env.getProperty("jdbc.url"));dataSource.setUsername(env.getProperty("jdbc.username"));dataSource.setPassword(env.getProperty("jdbc.password"));return dataSource;}@Beanpublic DataSourceInitializer dataSourceInitializer(DataSource dataSource) {DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();dataSourceInitializer.setDataSource(dataSource);ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();databasePopulator.addScript(new ClassPathResource("db.sql"));dataSourceInitializer.setDatabasePopulator(databasePopulator);dataSourceInitializer.setEnabled(Boolean.parseBoolean(initDatabase));return dataSourceInitializer;}	
}

在这里,我们使用Hibernate实现配置了DataSource和JPA EntityManagerFactory bean。

此外,我们还配置了DataSourceInitializer bean来初始化并使用种子数据填充表。 我们可以通过更改application.properties中的init-db属性值来启用/禁用执行此db.sql脚本。

最后,我们使用@EnableJpaRepositories启用了Spring Data JPA仓库扫描,以扫描JPA仓库接口的“ com.sivalabs.springapp.repositories ”包。

5.现在,让我们在com.sivalabs.springapp.web.config.WebMvcConfig.java中配置与Web相关的bean

package com.sivalabs.springapp.web.config;import java.util.Properties;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
@ComponentScan(basePackages = { "com.sivalabs.springapp.web"}) 
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter
{@Overridepublic void addViewControllers(ViewControllerRegistry registry){super.addViewControllers(registry);registry.addViewController("login/form").setViewName("login");		registry.addViewController("welcome").setViewName("welcome");registry.addViewController("admin").setViewName("admin");}@Beanpublic ViewResolver resolver(){InternalResourceViewResolver url = new InternalResourceViewResolver();url.setPrefix("/WEB-INF/jsp/");url.setSuffix(".jsp");return url;}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry){registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");}@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){configurer.enable();}@Bean(name = "messageSource")public MessageSource configureMessageSource(){ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();messageSource.setBasename("classpath:messages");messageSource.setCacheSeconds(5);messageSource.setDefaultEncoding("UTF-8");return messageSource;}@Beanpublic SimpleMappingExceptionResolver simpleMappingExceptionResolver(){SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver();Properties mappings = new Properties();mappings.put("org.springframework.dao.DataAccessException", "error");b.setExceptionMappings(mappings);return b;}
}

6.使用AbstractAnnotationConfigDispatcherServletInitializer便利类配置DispatcherService。

package com.sivalabs.springapp.web.config;import javax.servlet.Filter;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import com.sivalabs.springapp.config.AppConfig;public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{@Overrideprotected Class<?>[] getRootConfigClasses(){return new Class<?>[] { AppConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses(){return new Class<?>[] { WebMvcConfig.class };}@Overrideprotected String[] getServletMappings(){return new String[] { "/" };}@Overrideprotected Filter[] getServletFilters() {return new Filter[]{ new OpenEntityManagerInViewFilter()};}}

这里需要注意的几件事是我们将AppConfig.class配置为RootConfig类,将WebMvcConfig.class配置为ServletConfigClasses,这与我们使用ContextLoaderListener和DispatcherServlet的contextConfigLocation在web.xml中进行配置的方式类似。

另外,我们已经注册了OpenEntityManagerInViewFilter,以允许在视图呈现阶段延迟加载JPA实体图。

7.让我们配置SpringSecurity。

首先,让我们创建一个SecurityUser类,该类扩展了我们特定于应用程序的User类并实现了org.springframework.security.core.userdetails.UserDetails

package com.sivalabs.springapp.web.config;import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import com.sivalabs.springapp.entities.Role;
import com.sivalabs.springapp.entities.User;public class SecurityUser extends User implements UserDetails
{private static final long serialVersionUID = 1L;public SecurityUser(User user) {if(user != null){this.setId(user.getId());this.setName(user.getName());this.setEmail(user.getEmail());this.setPassword(user.getPassword());this.setDob(user.getDob());this.setRoles(user.getRoles());}		}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {Collection<GrantedAuthority> authorities = new ArrayList<>();Set<Role> userRoles = this.getRoles();if(userRoles != null){for (Role role : userRoles) {SimpleGrantedAuthority authority = new SimpleGrantedAuthority(role.getRoleName());authorities.add(authority);}}return authorities;}@Overridepublic String getPassword() {return super.getPassword();}@Overridepublic String getUsername() {return super.getEmail();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}	
}

我们将实现一个自定义的UserDetailsS​​ervice并使用Spring Data JPA存储库加载用户详细信息。

package com.sivalabs.springapp.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import com.sivalabs.springapp.entities.User;
import com.sivalabs.springapp.services.UserService;
import com.sivalabs.springapp.web.config.SecurityUser;@Component
public class CustomUserDetailsService implements UserDetailsService
{@Autowiredprivate UserService userService;@Overridepublic UserDetails loadUserByUsername(String userName)throws UsernameNotFoundException {User user = userService.findUserByEmail(userName);if(user == null){throw new UsernameNotFoundException("UserName "+userName+" not found");}return new SecurityUser(user);}
}

现在创建com.sivalabs.springapp.config.SecurityConfig.java ,其中包含与SpeingSecurity相关的bean定义。

package com.sivalabs.springapp.config;import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
//import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{@Autowiredprivate DataSource dataSource;@Autowiredprivate CustomUserDetailsService customUserDetailsService;@Overrideprotected void configure(AuthenticationManagerBuilder registry) throws Exception {/*registry.inMemoryAuthentication().withUser("siva").password("siva").roles("USER").and().withUser("admin").password("admin").roles("ADMIN","USER");*///registry.jdbcAuthentication().dataSource(dataSource);registry.userDetailsService(customUserDetailsService);}@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring().antMatchers("/resources/**");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/login","/login/form**","/register","/logout").permitAll().antMatchers("/admin","/admin/**").hasRole("ADMIN").anyRequest().authenticated().and().formLogin().loginPage("/login/form").loginProcessingUrl("/login").failureUrl("/login/form?error").permitAll();}
}

根据我们的SpringSecurity自定义表单登录配置,我们将在login.jsp中使用以下登录表单。

<!DOCTYPE html>
<%@taglib uri="http://www.springframework.org/tags"  prefix="spring"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<c:url var="rootURL" value="/"/>
<html>
<head>
<title>Login</title>
<link href="${rootURL}resources/bootstrap/css/bootstrap.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="${rootURL}resources/jquery/jquery-1.10.2.js"></script>
<script type="text/javascript" src="${rootURL}resources/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript" src="${rootURL}resources/js/app.js"></script>
</head>
<body><div class="col-md-6 col-md-offset-2">	<c:if test="${param.error != null}"><div class="alert alert-danger">Invalid UserName and Password.</div></c:if><c:if test="${param.logout != null}"><div class="alert alert-success">You have been logged out.</div></c:if>	</div>  <div class="row"><div class="col-md-6 col-md-offset-2">	<h2>User Login Form</h2><form:form id="loginForm" method="post" action="${rootURL}login" modelAttribute="user" class="form-horizontal" role="form" cssStyle="width: 800px; margin: 0 auto;"><div class="form-group"><label for="username" class="col-sm-2 control-label">UserName*</label><div class="col-sm-4"><input type="text" id="username" name="username" class="form-control" placeholder="UserName" /></div></div><div class="form-group"><label for="password" class="col-sm-2 control-label">Password*</label><div class="col-sm-4"><input type="password" id="password" name="password" class="form-control" placeholder="Password" /></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-4"><input type="submit" class="btn btn-primary" value="Login"></div></div></form:form></div>
</div>	
</body>
</html>

成功登录后,我们可以使用以下信息获取经过身份验证的使用详细信息,并使用以下信息保护视图的安全部分:

<h3>Email: <sec:authentication property="name"/></h3>
<h3><sec:authorize access="hasRole('ROLE_ADMIN')"><a href="admin">Administration</a></sec:authorize>
</h3>
<p>	<a href="logout">Logout</a></p>
</body>
  • 您可以在github https://github.com/sivaprasadreddy/sivalabs-blog-samples-code/tree/master/springmvc-datajpa-security-demo上找到源代码

参考: “ 我的实验”博客上的 JCG合作伙伴 Siva Reddy 使用JavaConfig的SpringMVC4 + Spring Data JPA + SpringSecurity配置 。

翻译自: https://www.javacodegeeks.com/2014/03/springmvc4-spring-data-jpa-springsecurity-configuration-using-javaconfig.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阅读《Google成功七堂课》

最近拜读了罗耀宗的《Google成功七堂课》&#xff0c;其中的观点很是不错&#xff0c;这里记录一下。第一课&#xff1a;打破规则第二课&#xff1a;打造更好的新产品第三课&#xff1a;以世界为实验室第四课&#xff1a;以用户的体验为念第五课&#xff1a;创造与分享价值第六…

mysql主从安装配置_如何安装和配置mysql主从同步

1)安装mysql&#xff1a;略2)启动mysqld:mysqld3)修改mysql的root 用户的password&#xff1a;mysql -u rootuse mysqlupdate user set passwordpassword(“”) where user”root”;grant all privileges on *.* to root’%’ identified by ‘’ with grant option;flush priv…

R语言中级--自定义方程

#求电费&#xff0c;&#xff1c;50,85折&#xff0c;50--120,50元/度&#xff0c;&#xff1e;120,1.15倍 myfunction <- function(deg,price 50){if(deg>120)energyprice deg*price*1.15else if(deg<80)energyprice deg*price*0.85else energyprice deg*pricere…

docker pull 镜像报错

[rootlocalhost ~]# docker pull ningx Using default tag: latest Trying to pull repository docker.io/library/ningx ... Get https://registry-1.docker.io/v2/: x509: certificate has expired or is not yet valid 上述的这种错误是时间有问题&#xff0c;更新一下时间…

mysql单表索引个数_MySQL性能:多个表与单个表和分区上的索引

小编典典创建20,000个表是一个坏主意。您很快将需要40,000个表&#xff0c;然后更多。我在《SQL反模式》一书中将此综合症称为Metadata Tribbles。您每次计划创建“每X表格”或“每X列”时都会看到这种情况。当您有成千上万个表时&#xff0c;这确实会导致实际的性能问题。每个…

在JDK 8中可通过反射获得构造函数/方法参数元数据

JDK 8较不为人所知的一项新 功能是在编译的Java类中包含参数元数据的可选功能[JDK增强建议&#xff08; JEP &#xff09; 118 ]。 此功能允许Java应用程序在运行时通过反射访问此参数元数据信息。 Java Tutorial的Reflection API路径包括一个名为“ 获取方法参数的名称”的课…

Web控件TreeView展开无闪烁的两个解决方法

已经无数次见到有人提出这个问题了。。。。。 第一种。。。。。 用.net控件TreeView而展开时不刷新的变通方法主要有以下步骤&#xff1a; 1。在Page_Load中为你的TreeView添加以下属性&#xff0c;这句话为TreeView添加Click时的回发事件。 TreeView1.Attributes["On…

基于面向对象的图片轮播(js原生代码)

无论你想走多远&#xff0c;你都需要不断地走下去。前端最精华的便是原生的js,这也是我们前端工程师的技术分层的重要指标&#xff0c;也提现这你的代码能力&#xff0c;开发的水平。废话不多说&#xff0c;进入今天的主要分享————基于面向对象思想的图片轮播。其效果如下所…

Spring boot 上传文件大小限制

1.spring boot 1.x 版本 application.properties 文件中 位置在&#xff08;resources下&#xff09; spring.http.multipart.maxFileSize 10Mb spring.http.multipart.maxRequestSize100Mb 2.spring boot 2.x 版本 application.properties 文件中 位置在&#xff08;resourc…

C#定义只能处理枚举类型的泛型类型

1 internal sealed class GenericTypeThatRequireAnEnum<T>2 {3 public static int age 12; //该 static 字段在不同的封闭类型之间是独立不共享的4 5 //静态构造器针对每个封闭类型都会执行一次&#xff0c;泛型类型定义静态构造器的目的就是为了保证传递的类…

电脑注册表被停用

“开始→运行”&#xff0c;输入“Gpedit&#xff0e;msc”后回车&#xff0c;打开“组策略”。然后依次展开“用户配置→管理模板→系统”&#xff0c;双击右侧窗口中的“阻止访问注册表编辑工具”&#xff0c;在弹出的窗口中选择“已禁用”&#xff0c;“确定”后再退出“组策…

Spring应用程序与JNDI连接池的集成测试

我们都知道&#xff0c;无论何时连接到数据库&#xff0c;都需要使用连接池。 所有使用JDBC 4类的现代驱动程序都支持它。 在本文中&#xff0c;我们将概述Spring应用程序中的连接池&#xff0c;以及如何在非JEE环境&#xff08;例如测试&#xff09;中处理相同的上下文。 在S…

jsp 上传转码_最完整的处理jsp处理乱码问题步骤,不需要手工转码

以编码格式为UTF-8为例1&#xff0c;jsp页面文件编码格式&#xff0c;在eclipse右键-》properties-》resource-》text file encode修改该UTF-82&#xff0c;jsp页面上的跟上面一样&#xff0c;为文件存储格式&#xff0c;按此格式存储文件&#xff0c;并编译里面汉字3&#xff…

CSS未知宽高元素水平垂直居中

方法一 &#xff1a;table、cell-table 思路&#xff1a;显示设置父元素为&#xff1a;table&#xff0c;子元素为&#xff1a;cell-table&#xff0c;这样就可以使用vertical-align: center&#xff0c;实现水平居中优点&#xff1a;父元素&#xff08;parent&#xff09;可以…

在java web工程中jsp页面中使用kindeditor

在这之前我们用Notepad写过kindeditor 在Java web工程里也差不多 首先我们复制之前的thml代码粘贴到工程里 然后把样式也复制进去 然后就可以运行了 转载于:https://www.cnblogs.com/q2546/p/11066539.html

数据分析方法论

把零散的报表整成数据监控体系 把每次拍脑袋的评估整成数据考核体系 在推荐、广告等算法上有所突破&#xff0c;而不是自己瞎捣鼓个没人看的聚类分析 在推送响应等有业绩的地方产出产品&#xff0c;而不是每次用时间序列法预测个销量走势再被业务喷回来。 分析自己的现状&am…

链接服务器

使用sql-server进行分布式查询&#xff08;链接服务器&#xff09; 可以使用sql-server企业管理器进行建立&#xff0c;注意其中的rpc及rpc out两项&#xff0c;也可以使用sql语句来完成定义&#xff0c;主要涉及到三个存储过程sp_addlinkedserver&#xff0c;sp_serveroption和…

mysql表级别的操作_MySql 库/表级操作 及 数据类型 - 纪宇

数据库分类关系型数据库(SQL)&#xff1a;存储方式固定&#xff0c;安全非关系型数据库(NoSQL)&#xff1a;存储方式比较灵活&#xff0c;存储数据的效率比较高&#xff0c;不太安全MySQL是一种关系型数据库管理系统(采用关系模型来组织管理数据的数据库系统)注意事项大小写&am…

具有Java 8支持的Spring Framework 4.0.3和Spring Data Redis 1.2.1

Spring Framework 4.0.3 正如Spring社区宣布的那样&#xff0c;Spring Framework 4.0.3现在可用。 它是上周Java 8发布后框架的第一个版本&#xff0c;因此它是使用OpenJDK 8 GA构建的&#xff0c;并包含最新的ASM 5.0.1。 Spring Framework 4.0.3为WebSockets带来了重要的增强…

Markdown的使用笔记

Markdown的使用笔记 Markdown在我看是一种使用几种标记符号就可以完成清晰排版的一种标记语言&#xff0c;是写笔记文章的一大利器&#xff0c;使用简单、方便&#xff0c;上手快&#xff0c;而且可以很好的兼容html&#xff0c;即html中的标签在markdown中也同样试用。这边文章…