一. 面试题及剖析
1. 今日面试题
2. 题目剖析
今天的题目,表面看与之前壹哥讲解的Get、Post请求方式及其区别有关,但其实面试官更深层次的是想考察我们解决具体问题的能力。遇到这种针对具体问题、寻求具体解决方案的面试题,此时更多的不是靠记忆,而是靠我们对知识的综合应用,还有就是自己的应变能力、逻辑分析能力。
有的小伙伴可能会说,我之前从来没遇到过这样的需求或问题,我没做过类似的效果,那该怎么回答这样的问题呢?别害怕,壹哥告诉你回答这类问题的思路!
其实此时如果你能把这个问题的解决方案完美的说出来,当然是最好啦,面试官自然很满意。但万一这种针对具体业务的解决思路问题,我们之前确实没有遇到过,那该怎么办?其实这时候可以坦诚的跟面试官承认,自己之前确实没有遇到过或想过这样的问题,但是此时一定不能直接跟面试官说“不知道”!你此时应该根据题目中相关的技术,给出自己认为可行的方案,当然你给的方案不一定正确,不一定可行,但一定要有自己的想法!例如可以这么回答,“说实话,这个问题我之前还真没遇到过,但我觉得可以这么做xxx.......或者那么做xxx.......”。
这种问题,一方面是在考察我们解决问题的实际经验,另一方面也是在考察我们有没有解决问题的思路!入职以后,我们以后的开发时间还很长,总会遇到一些之前没有遇到过的问题,如果你每次遇到新问题,都跟自己的老大说,“这个我之前没干过,我不会;那个我没弄过,我搞不了”。那人家公司一个月几万块养着你干嘛啊?所以遇到这种针对具体业务的问题,我们完全可以大胆的给出自己不一定成熟的解决思路,一定要敢想才行!这种问题不能直接来一个“不知道、不清楚”了事!当然我们的回答,要尽可能地往相关内容上靠,不能一点边都不沾。
分析了这么多,接下来壹哥就给大家提供几个可行的解决方案,算是抛砖引玉吧,如果大家有更好的其他解决方案,可以在评论区留言讨论哦。
二. 解决方案
在上一篇文章中,壹哥给大家详细地讲解了HTTP的8种请求方式,其中重点说明了GET与POST两种常用请求方式的区别。基于GET与POST的种种区别,尤其是GET请求默认只会执行1次,POST请求默认会执行2次,而且GET请求在浏览器回退时是无害的,POST请求会再次提交一次请求。基于这些区别,所以有些特殊的项目和业务中,可能就会要求这个请求只能用GET,不能用POST,那这个需求该如何满足呢?壹哥给大家列出了如下解决方案:
接下来,壹哥针对这几个方案,进行简单的实现说明。因为我们这里不是专门的教程文章,只是对面试题进行讲解,所以不会贴出特别详细的代码和配置文件,如果你对相关技术不是很熟悉,可以来找壹哥学习哦。
1. 限制请求方式方案
这种方案主要通过代码来进行实现,常用的就是在SpringMVC环境中,对请求方式进行限定,主要是基于@RequestMapping注解,或者是@GetMapping、@PostMapping注解。另外,我们还可以通过代码来配置实现。所以这里通过限制请求方式来进行实现,又可以分为2种情况,下面壹哥会把两种方案的核心代码粘贴出来。
1.1 请求注解
限定请求方式,比较简单的实现方案,就是基于SpringMVC提供的@RequestMapping、@GetMapping、@PostMapping注解注解,代码如下:
@RestController
public class IndexController {
//这里既可以允许GET请求,又可以允许POST请求。否则会产生405异常
@RequestMapping(value = "/index", method = {RequestMethod.GET, RequestMethod.POST})
public String index() {
//这里既可以允许GET请求,又可以允许POST请求
return "success";
}
//只允许GET请求,否则会产生405异常
@GetMapping("/users")
public String users() {
//这里只允许GET请求
return "users";
}
//只允许POST请求,否则会产生405异常
@PostMapping("/user/{id}")
public String addUser(@PathVariable("id") Integer id) {
//这里只允许POST请求
return "users" + id;
}
}
这样很轻松的就限制了某种请求方式,如果你非得使用别的请求方式,响应给你的执行结果肯定是405请求方法不允许!
1.2 配置代码
当然上面限制请求方式的方案,都是针对某个具体的业务方法而言的。有的童鞋说,我们的业务很特殊,项目中所有的业务方法都必须用POST或者是GET,虽然一个一个方法加注解可以实现,但总觉得有点麻烦,有没有其他的解决办法呢?有的!只要你提了需求,壹哥就尽量满足你,咱们再往下看。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public TomcatServletWebServerFactory servletContainer() {
//自定义嵌入式Tomcat容器
TomcatServletWebServerFactory tomcatServletContainerFactory = new TomcatServletWebServerFactory();
tomcatServletContainerFactory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
SecurityCollection collection = new SecurityCollection();
//允许的http请求方法
collection.addMethod("GET");
collection.addMethod("POST");
//url匹配表达式
collection.addPattern("/*");
constraint.addCollection(collection);
constraint.setAuthConstraint(true);
//设置使用httpOnly
context.setUseHttpOnly(true);
}
});
return tomcatServletContainerFactory;
}
/**
* 针对前后端分离时ajax的跨域配置
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
//针对的映射
registry.addMapping("/**")
//针对的origin域名
.allowedOrigins("*")
//针对的方法
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
//是否允许发送Cookie
.allowCredentials(true)
//从预检请求得到相应的最大时间,默认30分钟
.maxAge(3600)
//针对的请求头
.allowedHeaders("*");
}
}
上面的代码中,壹哥分别针对普通的Web请求和跨域配置进行了代码实现,大家可以参考。
2. Nginx配置方案
如果我们的项目,Web服务器之前还存在Nginx这样的反向代理服务器进行负载均衡,我们也可以在Nginx这样的代理服务器配置文件中进行限制,nginx.conf配置文件核心内容如下:
if ($request_method !~ ^(GET|POST)$ ) {
return 403;
}
3. Apache配置方案
另外我们也可以结合Apache提供的.htaccess配置文件进行配置。
<Location />
<LimitExcept GET POST>
Order Allow,Deny
Deny from all
</LimitExcept>
</Location>
这种方式仅做了解即可,我们更多的还是使用前2种方式更容易。
三. 结语
至此,壹哥就给大家提供了几个可行的解决本问题的方案,当然在开发中,同样的效果会有多种解决方案,如果你还有其他更好的解决办法,可以在评论区给壹哥留言讨论,看看你的办法是不是更好。交流使我们进步,讨论让我们成长哦!原创不易,看到这里请给壹哥点个赞呗!