最后
分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。
面试经验技巧篇
- 经验技巧1 如何巧妙地回答面试官的问题
- 经验技巧2 如何回答技术性的问题
- 经验技巧3 如何回答非技术性问题
- 经验技巧4 如何回答快速估算类问题
- 经验技巧5 如何回答算法设计问题
- 经验技巧6 如何回答系统设计题
- 经验技巧7 如何解决求职中的时间冲突问题
- 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
- 经验技巧9 在被企业拒绝后是否可以再申请
- 经验技巧10 如何应对自己不会回答的问题
- 经验技巧11 如何应对面试官的“激将法”语言
- 经验技巧12 如何处理与面试官持不同观点这个问题
- 经验技巧13 什么是职场暗语
面试真题篇
- 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
- 真题详解2 某知名社交平台软件工程师笔试题
- 真题详解3 某知名安全软件服务提供商软件工程师笔试题
- 真题详解4 某知名互联网金融企业软件工程师笔试题
- 真题详解5 某知名搜索引擎提供商软件工程师笔试题
- 真题详解6 某初创公司软件工程师笔试题
- 真题详解7 某知名游戏软件开发公司软件工程师笔试题
- 真题详解8 某知名电子商务公司软件工程师笔试题
- 真题详解9 某顶级生活消费类网站软件工程师笔试题
- 真题详解10 某知名门户网站软件工程师笔试题
- 真题详解11 某知名互联网金融企业软件工程师笔试题
- 真题详解12 国内某知名网络设备提供商软件工程师笔试题
- 真题详解13 国内某顶级手机制造商软件工程师笔试题
- 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
- 真题详解15 某著名社交类上市公司软件工程师笔试题
- 真题详解16 某知名互联网公司软件工程师笔试题
- 真题详解17 某知名网络安全公司校园招聘技术类笔试题
- 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题
资料整理不易,点个关注再走吧
第三步:创建配置文件application.yml (暂时不写任何内容)
第四步:定义启动类,代码如下
package com.cy.jt;
@SpringBootApplication
public class SecurityJwtApplication {
public static void main(String[] args) {
SpringApplication.run(
SecurityJwtApplication.class,
args);
}
}
第四步:运行启动类,检测是否可成功启动
编写单元测试,实践Token对象的创建与解析,例如:
@Test
void testCreateAndParseToken(){
//1.创建令牌
//1.1定义负载信息
Map<String,Object> map=new HashMap<>();
map.put(“username”, “jack”);
map.put(“permissions”, “sys:res:create,sys:res:retrieve”);
//1.2定义过期实践
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.MINUTE, 30);
Date expirationTime=calendar.getTime();
//1.3定义密钥
String secret=“AAABBBCCCDDD”;
//1.4生成令牌
String token= Jwts.builder()
.setClaims(map)
.setIssuedAt(new Date())
.setExpiration(calendar.getTime())
.signWith(SignatureAlgorithm.HS256,secret)
.compact();
System.out.println(token);
//2.解析令牌
Claims claims = Jwts.parser().setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
System.out.println(“claims=”+claims);
}
为了简化JWT在项目中的应用,我们通常会构建一个工具类,对token的创建和解析进行封装,例如:
package com.cy.jt.security.util;
public class JwtUtils {
/**
- 秘钥
*/
private static String secret=“AAABBBCCCDDDEEE”;
/**
-
有效期,单位秒
-
默认30分钟
*/
private static Long expirationTimeInSecond=1800L;
/**
-
从token中获取claim
-
@param token token
-
@return claim
*/
public static Claims getClaimsFromToken(String token) {
try {
return Jwts.parser()
.setSigningKey(secret.getBytes())
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
throw new IllegalArgumentException(“Token invalided.”);
}
}
/**
-
判断token是否过期
-
@param token token
-
@return 已过期返回true,未过期返回false
*/
private static Boolean isTokenExpired(String token) {
Date expiration = getClaimsFromToken(token).getExpiration();
return expiration.before(new Date());
}
/**
-
为指定用户生成token
-
@param claims 用户信息
-
@return token
*/
public static String generateToken(Map<String, Object> claims) {
Date createdTime = new Date();
Date expirationTime = new Date(System.currentTimeMillis() + expirationTimeInSecond * 1000);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(createdTime)
.setExpiration(expirationTime)
.signWith(SignatureAlgorithm.HS256,secret)
.compact();
}
}
====================================================================
AuthController 认证服务
定义AuthController用于处理登录认证业务,代码如下:
package com.cy.jt.security.controller;
@RestController
public class AuthController {
@RequestMapping(“/login”)
public Map<String,Object> doLogin(String username,
String password){
Map<String,Object> map=new HashMap<>();
if(“jack”.equals(username)&&“123456”.equals(password)){
map.put(“state”,“200”);
map.put(“message”,“login ok”);
Map<String,Object> claims=new HashMap<>();//负载信息
claims.put(“username”,username);
map.put(“Authentication”, JwtUtils.generatorToken(claims));
return map;
}else{
map.put(“state”,“500”);
map.put(“message”,“login failure”);
return map;
}
}
}
ResourceController 资源服务
定义一个资源服务对象,登录成功以后可以访问此对象中的方法,例如:
package com.cy.jt.security.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ResourceController {
@RequestMapping(“/retrieve”)
public String doRetrieve(){
//检查用户有没有登录
//执行业务查询操作
return “do retrieve resource success”;
}
@RequestMapping(“/update”)
public String doUpdate(){
//检查用户有没有登录
//执行业务查询操作
return “do update resource success”;
}
}
TokenInterceptor 拦截器及配置
假如在每个方法中都去校验用户身份的合法性,代码冗余会比较大,我们可以写一个Spring MVC 拦截器,
在拦截器中进行用户身份检测,例如:
package com.cy.jt.security.interceptor;
import com.cy.jt.security.util.JwtUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
-
令牌(token:ticker-通票)拦截器
-
其中,HandlerInterceptor为Spring MVC中的拦截器,
-
可以在Controller方法执行之前之后执行一些动作.
-
1)Handler 处理器(Spring MVC中将@RestController描述的类看成是处理器)
-
2)Interceptor 拦截器
*/
public class TokenInterceptor implements HandlerInterceptor {
/**
-
preHandle在目标Controller方法执行之前执行
-
@param handler 目标Controller对象
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
//http://localhost:8080/retrieve?Authentication=
//String token= request.getParameter(“Authentication”);
String token=request.getHeader(“Authentication”);
//判定请求中是否有令牌
if(token==null||“”.equals(token))
throw new RuntimeException(“please login”);
//判定令牌是否已经过期
boolean flag=JwtUtils.isTokenExpired(token);
if(flag)
throw new RuntimeException(“login timeout,please login”);
return true;//true表示放行,false表示拦截到请求以后,不再继续传递
}
}
拦截器编写好以后,需要将拦截器添加到spring mvc执行链中并设置要拦截的请求,可通过配置类完成这个过程,代码如下:
package com.cy.jt.security.config;
/**
- 定义Spring Web MVC 配置类
*/
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
/**将拦截器添加到spring mvc的执行链中
-
@param registry 此对象提供了一个list集合,可以将拦截器添加到集合中
-
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor())
//配置要拦截的url
.addPathPatterns(“/retrieve”,“/update”);
}
}
总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
小米商场项目实战,别再担心面试没有实战项目:
eptorRegistry registry) {
registry.addInterceptor(new TokenInterceptor())
//配置要拦截的url
.addPathPatterns(“/retrieve”,“/update”);
}
}
总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
[外链图片转存中…(img-KyJ3XJJL-1714902370507)]
小米商场项目实战,别再担心面试没有实战项目:
[外链图片转存中…(img-cx3GZU3e-1714902370507)]