>

求得该数的逆序的数值格局,随机数相关的小演

- 编辑:云顶娱乐yd2221 -

求得该数的逆序的数值格局,随机数相关的小演

话非常的少说,附上代码:相关的文字表明笔者会在代码注释中标记出来

import java.util.Random;public class TestThree{ public static void main(String[] args){ Random random = new Random(); final int MIN = 100; final int MAX = 1000; int num1 = (Math.random()*+MIN); //无符号右移,为了得到一个正整数。 int num2 = (random.nextInt()>>>1)%+MIN; int num3 = (Math.random()*+MIN); System.out.println("num1 = "+num1 + "t num2 = "+num2 + "tnum3 = "+num3); //如果num1 大于 num2 返回 num1 否则 返回 num2 int max = num1 > num2 ? num1 : num2; //嵌套的三目 int max1 = num1 > num2 ? (num1 > num3 ? num1 : num3 ) : (num2 > num3 ? num2 : num3); System.out.println("max = " + max); System.out.println("max1 = " + max1); }}

import java.util.Random;public class TestThree1{ public static void main(String[] args){ Random random = new Random(); final int MIN = 100; final int MAX = 1000; int number = (Math.random()*+MIN); System.out.println(number + "是" + ( number%2 == 0 ? "偶数" : "奇数" )); System.out.println(number + "是" + ((number & 1) == 0 ? "偶数" : "奇数" )); }}

第一,上一节的终极,作者介绍了一些逻辑运算符,下边附上一些代码,(在解说中会有详细描述)

在说运算符在此以前,首先先聊聊*操作数云顶娱乐,和表达式*的概念,终归运算符要跟操作数在联合才有意义

一、记住自身遵从基本原理

原理图

云顶娱乐 1牢记自身效劳基本原理

两个呼吁,先踏向UsernamePasswordAuthenticationFilter,当以此过滤器认证成功今后,会调用贰个RemeberMeService服务,在RemeberMeService类里面有三个TokenRepository方法。RemeberMeService那个服务会干什么吗?它会转移多个token,然后将那个token存入到浏览器的Cookie中去。同不常间TokenRepository方法还足以将这几个Token写入到数据库中,因为本人那么些动作是在经过UsernamePasswordAuthenticationFilter认证成功之后去做的,所以在存入DB的时候会将顾客名和token存入进去即token和客户名是各种对应的。品级二天那些同四个客户再一次拜望系统的时候,那几个供给在经过过滤器链的时候会由此RememberMeAuthenticationFilter过滤器,这么些过滤器的作用正是读取cookie中的token,然后提交RemeberMeService,RemeberMeService会用TokenRepository到数据库中去询问这几个token在数据库中有未有记录,借使有记录会将username抽出来,收取来之后会调用UserDetailsService去获取顾客新闻,然后将顾客新闻存入到SecurityContext中去,以此来贯彻记住作者效劳。

RemeberMeService的过滤器链地方

云顶娱乐 2112.png

public class TestMain{ //求随机数[100-1000),人性化打印,求得该数的逆序的数值形式,并打印。 //思路:将个位十位百位单独求出来,然后个位和百位交换位置即可。 public static void main(String[] args){ //java 中如何得到一个随机数 final int MIN = 100; final int MAX = 1000; //随机数 返回一个double 值,随机的。0 到 1.0 前闭后开 //Math.random double ran = Math.random(); double number = ran*+MIN; //System.out.println; //将double转化为int int intNum = number; //思考,如果通过一行代码实现得到一个指定区间的随机数。 //一行实现得到一个指定区间的随机数 intNum = (Math.random()*+MIN); System.out.println("随机数为:"+intNum); //个位,十位,百位 int theUnitNum = intNum%10; int tensDigitNum = intNum/10%10; int hundredsNum = intNum/100; //新数 int newNum = theUnitNum * 100+tensDigitNum*10 + hundredsNum; System.out.println("随机数:"+intNum+"t的逆序形式为:"+newNum); } }
public class TestLogic{ public static void main(String[] args){ //逻辑与 & 二元运算符,只要有个参与逻辑与运算的 操作数 为 false 那么整个逻辑表达式的结果就为false。 //有false 就是false,全 true 才 true。 System.out.println(false & true);//false System.out.println(true & false);//false System.out.println(false & false);//false System.out.println(true & true);//true System.out.println("************************************"); //逻辑或 | 有true 则 true ,全false 则false。 System.out.println(false | true);//true System.out.println(true | false);//true System.out.println(false | false);//false System.out.println(true | true);//true //逻辑异或 ^ 相异为true,,相同为 false。 System.out.println("************************************"); System.out.println(false ^ true);//true System.out.println(true ^ false);//true System.out.println(false ^ false);//false System.out.println(true ^ true);//false //逻辑非 ! 一元运算符 对boolean 值取反 true --> false false -- > true int a = 9; System.out.println;//true System.out.println;//false System.out.println(!(++a == a++));//false System.out.println("************************************"); //短路与 && 规律,和使用的结果 和 逻辑与一致。 System.out.println(false && true);//false System.out.println(true && false);//false System.out.println(false && false);//false System.out.println(true && true);//true //区别 在进行逻辑运算的时候,只要前面有一个表达式的值为false,那么短路与将忽略后续的所有参与逻辑与运算的表达式。 a = 10; int b = 15; boolean bool = (a > 15) && (b++ < 20); System.out.println("bool = "+bool);//false System.out.println;//16 //短路或 || 如果前面的表达式的返回值有true,那么后续的表达式将全部被忽略。 //总结:短路与 与 短路或 执行的效率 比 逻辑与 和 逻辑或的效率要高。 }}

求得该数的逆序的数值格局,随机数相关的小演练。操作数:参预运算的数额被称呼操作数。

二、记住本身效劳具体贯彻

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>登录</title></head><body> <h1>标准登录页面</h1> <h3>表单登录</h3> <form action="/authentication/form" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"/></td> </tr> <tr> <td>验证码:</td> <td> <input type="text" name="imageCode"/> <img src="/code/image?width=150"> </td> </tr> <tr> <td colspan="2"><input name="remember-me" type="checkbox" value="true"/>记住我</td> </tr> <tr> <td colspan="2"><button type="submit">登录</button></td> </tr> </table> </form></body></html>

因为加上"记住本身"那么些职能须要用到DB,所以自个儿在properties文件中去加入小编的数据库的信息

spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/tinner-demo?useUnicode=yesspring.datasource.username=rootspring.datasource.password=root

第一去安插PersistentTokenRepository ,在那个里面将dataSource注入进来,然后在这么些类中有一个tokenRepository.setCreateTableOnStartup;方法,这一个措施会去db中新建贰个囤积token和客商名的表,然后项目里面之后,会活动地去DB中新建这些表,但是在随后就不能够再把那几个打开了,供给注释掉。

 @Autowired private DataSource dataSource; @Autowired private UserDetailsService userDetailsService; @Bean public PersistentTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); tokenRepository.setDataSource(dataSource);// tokenRepository.setCreateTableOnStartup; return tokenRepository; }

接下来在BrowserProperties中去设置三个暗中同意的时刻思念本身的时刻,那些也是足以在配置文件中去安插的。默许自个儿写了3600秒

package com.tinner.security.core.properties;public class BrowserProperties { private String loginPage = "/tinner-signIn.html"; private LoginType loginType = LoginType.JSON; private int rememberMeSecond = 3600; public int getRememberMeSecond() { return rememberMeSecond; } public void setRememberMeSecond(int rememberMeSecond) { this.rememberMeSecond = rememberMeSecond; } public LoginType getLoginType() { return loginType; } public void setLoginType(LoginType loginType) { this.loginType = loginType; } public String getLoginPage() { return loginPage; } public void setLoginPage(String loginPage) { this.loginPage = loginPage; }}

下一场在configure方法中布局

 http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) .formLogin() .loginPage("/authentication/require") .loginProcessingUrl("/authentication/form") .successHandler(tinnerAuthentivationSuccessHandler) .failureHandler(tinnerAuthentivationFailureHandler) .and() .rememberMe() .tokenRepository(persistentTokenRepository .tokenValiditySeconds(securityProperties.getBrowser().getRememberMeSecond .userDetailsService(userDetailsService)

就算要去调用rememberMe服务,然后调用tokenRepository方法, 设置三个cookie有效时间,最终回来回去的时候调用userDetailsService这些服务,将顾客消息重回给前台。

云顶娱乐 3选拔位运算符求随机数

借使是叶影参差使用呢?可以施行下以下代码,观望输出结果:

表明式:使用运算符将若干个操作数连接起来的一体化。 每二个操作数也能够被看作多少个简短的表明式。

三、记住我效劳SpringSecurity源码深入分析

第一,需要会进去UsernamePasswordAuthenticationFilter中,校验完顾客名密码之后会调用rememberMe瑟维斯的loginSuccess方法

云顶娱乐 4铭记本身效劳SpringSecurity源码分析

在这么些登陆成功方法里面,它做了两件事,第一件事是用tokenRepository去创设二个新的token存入到数据库中。第二件是正是将扭转的token存入到浏览器的cookie中去。

云顶娱乐 5登陆成功的情势

当今浏览器中输入url,然后须求步入到了RememberMeAuthenticationFilter过滤器中,它首先会咬定SecurityContextHolder中是否有三个验证过的Authentication,如果未有就能去调用rememberMeService的autoLogin方法

云顶娱乐 6在有remeberMe作用开启的情状下再一次登入深入分析

在那几个格局中第一会从呼吁的cookie中得到token,然后再调用getTokenForService去数据库中去拿相应的token和客户名音讯。假设token没值就能够抛出非常,假如有值则会去举行判断(token是还是不是过期等)

云顶娱乐 7144.png云顶娱乐 81222这个检查都经过了,最后会调用getUserDetailsService的loadUserByUsername方法。云顶娱乐 9585.png

即用找到的格外顾客名去调用UserDetailService去获取客商音信,最后回到到RememberMeAuthenticationFilter。

然后RememberMeAuthenticationFilter得到了今后会将客商音信存入到session中去。

何况还大概有:

云顶娱乐 10逻辑运算符与自增运算符的逻辑

重回值:表明式运算完毕今后都会有贰个回来结果。

本文由云顶娱乐yd2221发布,转载请注明来源:求得该数的逆序的数值格局,随机数相关的小演