java 屏蔽地域性访问_javaweb利用filter拦截未授权请求
项目上有个小需求,要限制访问者的IP,屏蔽未授权的请求。该场景使用过滤器来做再合适不过了。
SecurityFilter.java:
public class SecurityFilter implementsFilter {private Log log = LogFactory.getLog(SecurityFilter.class);private List whitelist = new ArrayList();private List regexlist = new ArrayList();private static final String _JSON_CONTENT = "application/json; charset=UTF-8";private static final String _HTML_CONTENT = "text/html; charset=UTF-8";private static final String _403_JSON = "{'code': '403', 'msg': '访问被拒绝,客户端未授权!'}";private static final String _403_HTML = "
403 Forbidden!
@lichmama
";
@Overridepublic voiddestroy() {
}
@Overridepublic voiddoFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)throwsIOException, ServletException {
HttpServletRequest request=(HttpServletRequest) servletrequest;
HttpServletResponse response=(HttpServletResponse) servletresponse;if(isSecurityRequest(request)) {
filterchain.doFilter(request, response);
}else{
log.info("拒绝来自[" + request.getRemoteAddr() + "]的访问请求:" +request.getRequestURI());
response.setStatus(403);if(isAjaxRequest(request)) {
response.setContentType(_JSON_CONTENT);
response.getWriter().print(_403_JSON);
}else{
response.setContentType(_HTML_CONTENT);
response.getWriter().print(_403_HTML);
}
}
}
@Overridepublic void init(FilterConfig filterconfig) throwsServletException {
String allowedIP= filterconfig.getInitParameter("allowedIP");if (allowedIP != null && allowedIP.length() > 0) {for (String item : allowedIP.split(",\\s*")) {//支持通配符*
if (item.contains("*")) {
String regex= item.replace(".", "\\.").replace("*", "\\d{1,3}");
regexlist.add(regex);
}else{
whitelist.add(item);
}
}
}
}/*** 判断当前请求是否来自可信任的地址
*
*@paramrequest
*@return
*/
private booleanisSecurityRequest(HttpServletRequest request) {
String ip=request.getRemoteAddr();for(String item : whitelist) {if(ip.equals(item))return true;
}for(String item : regexlist) {if(ip.matches(item))return true;
}return false;
}/*** 判断请求是否是AJAX请求
*@paramrequest
*@return
*/
private booleanisAjaxRequest(HttpServletRequest request) {
String header= request.getHeader("X-Requested-With");if (header != null && header.length() > 0) {if ("XMLHttpRequest".equalsIgnoreCase(header))return true;
}return false;
}
}
web.xml增加配置:
securityFilter
com.lichmama.webdemo.filter.SecurityFilter
allowedIP
192.168.5.*
securityFilter
/*
尝试访问,结果如下:
*如何在Filter中获取Response的内容?这个问题之前还真没思考过,搜索了下得知如下方法可行:
1.实现一个PrintWriterWrapper,用于替换ServletResponse中的Writer
packagecom.lichmama.webdemo;importjava.io.PrintWriter;importjava.io.Writer;public class PrintWriterWrapper extendsPrintWriter {privateStringBuilder buff;publicPrintWriterWrapper(Writer writer) {super(writer);
buff= newStringBuilder();
}
@Overridepublic void write(inti) {super.write(i);
buff.append(i);
}
@Overridepublic void write(char[] ac, int i, intj) {super.write(ac, i, j);
buff.append(ac, i, j);
}
@Overridepublic void write(char[] ac) {super.write(ac);
buff.append(ac);
}
@Overridepublic void write(String s, int i, intj) {super.write(s, i, j);
buff.append(s, i, j);
}
@Overridepublic voidwrite(String s) {super.write(s);
buff.append(s);
}
@Overridepublic voidflush() {super.flush();
buff.delete(0, buff.length());
}publicString getContent() {returnbuff.toString();
}
}
View Code
2.实现一个ResponseWrapper,用于替换过滤链(FilterChain)中的ServletResponse:
packagecom.lichmama.webdemo;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpServletResponseWrapper;public class ResponseWrapper extendsHttpServletResponseWrapper {privatePrintWriterWrapper writer;publicResponseWrapper(HttpServletResponse response) {super(response);
}
@Overridepublic PrintWriter getWriter() throwsIOException {if (writer == null)
writer= new PrintWriterWrapper(super.getWriter());returnwriter;
}
}
View Code
3.编写Filter实现获取Response的内容捕获:
packagecom.lichmama.webdemo.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletResponse;importcom.lichmama.webdemo.PrintWriterWrapper;importcom.lichmama.webdemo.ResponseWrapper;public class TestFilter implementsFilter {
@Overridepublic void init(FilterConfig filterconfig) throwsServletException {
}
@Overridepublic voiddoFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)throwsIOException, ServletException {
ResponseWrapper responsewrapper= newResponseWrapper((HttpServletResponse) servletresponse);
filterchain.doFilter(servletrequest, responsewrapper);
PrintWriterWrapper writerWrapper=(PrintWriterWrapper) responsewrapper.getWriter();//TODO retrieve content from PrintWriterWrapper
String content =writerWrapper.getContent();
}
@Overridepublic voiddestroy() {
}
}
that's it~
java 屏蔽地域性访问_javaweb利用filter拦截未授权请求相关推荐
- java 屏蔽地域性访问_外贸网站屏蔽中国IP访问的多种方法
大家都知道的原因,做外贸站,国人喜欢研究你的站,还总是帮你进行压力测试-- 首先想到要屏蔽中国IP就会是把中国IP库加入Nginx配置文件中,然后WEB服务器对比IP来达到屏蔽. 在Nginx中加de ...
- shiro 同时实现url和按钮的拦截_Shiro是如何拦截未登录请求的(一)
问题描述 之前在公司搭项目平台的时候权限框架采用的是shiro,由于系统主要面向的是APP端的用户,PC端仅仅是公司内部人员在使用,而且考虑到系统的可用性和扩展性,服务端首先基于shiro做了一些改造 ...
- java oauth2搭建_Spring Security 实战干货:OAuth2授权请求是如何构建并执行的
在Spring Security 实战干货:客户端OAuth2授权请求的入口中我们找到了拦截OAuth2授权请求入口/oauth2/authorization的过滤器OAuth2Authorizati ...
- oauth2 java 客户端_Spring Security 实战干货:客户端OAuth2授权请求的入口
正版spring security实战编程与 54.9元 (需用券) 去购买 > 1. 前言 在Spring Security 实战干货:OAuth2第三方授权初体验一文中我先对OAuth2.0 ...
- java web 找回密码_JavaWeb利用邮箱帮用户找回密码
本文是介绍在一个小的JAVAWeb项目中,利用邮箱帮用户找回密码. 效果展示 需要一个发送邮件的jar包 : javax.mail .jar 1.JSP页面(设置邮箱输入框) pageEncoding ...
- php 屏蔽curl访问,php curl指定ip,php curl请求忽略本地host文件,php curl请求跳过本地host文件...
假如我们使用curl请求一个网站,如果这个网站域名在本地host中也存在,curl默认会请求本地,但是我们可以自己设置解析到哪个ip. (1).设置朋友的博客网站主机和ip,请求测试正确返回远程网站内 ...
- shiro 拦截未登录的ajax_Shiro是如何拦截未登录请求的(二)
/** * 重写父类获取sessionID的方法,若请求为APP或者H5则从请求头中取出token,若为PC端后台则从cookie中获取 * * @param request * @param res ...
- Redis未授权访问漏洞复现
Redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...
- 未授权访问漏洞-Redis未授权访问漏洞
文章目录 未授权概述 常见未授权访问漏洞 Redis未授权访问 Redis简介 应用场景 Redis 架构 漏洞发现 端口 端口探测 Redis常用命令 Redis历史漏洞 Redis未授权访问 Re ...
最新文章
- 一起做激光SLAM:ICP匹配用于闭环检测
- BCH综述:数以百万计的商人,更多的代币和冲突的愿景
- C/C++程序训练6---歌德巴赫猜想的证明_JAVA
- SAP Cloud for Customer Sales Lead明细页面视图的UI模型
- java spring 服务器关闭连接_java springboot websocket 服务 服务器主动关闭连接 导致 抛出java.io.EOFException异常...
- anychart说明文档
- IT部门不应该是一个后勤部门
- php request time,php中time()与$_SERVER[REQUEST_TIME]用法区别分析
- jqgrid为什么表头和数据之间有间隙_面试官:你看过Redis数据结构底层实现吗?...
- 约瑟夫环-单向循环链表
- 修改linux引导文件系统,修改/etc/fstab文件加快Linux系统的启动速度
- mysql 敏感词_过滤敏感词方式
- c++ vs2015 播放音乐_三星s20都取消了耳机孔,1k-2k的播放器会成为直推党新选择吗?...
- 论文研究14:Deep Attention Gated Dilated Temporal Convolutional Networks with Intra-Parallel model
- Android studio 中使用GeenDao
- 数字企业-数字社会-数字中国,统一一套方法论
- 关于onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
- R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果图像垂直堆叠排列进行组合构图(vertically stack the plots)
- YOLOX之绘制AP图与损失曲线
- HEVC Study Three(基于HM14.0平台)--GOP研究之大揭秘
热门文章
- SAP Spartacus checkout页面的入口逻辑
- CRM_MESSAGES_DISPLAY debug
- What is the usage of excludedParameters
- Reuse library debug in Chrome - phase1 init phase
- CHIP ID was not passed on from the tile; contact your system administrator
- How are SAP ui5 Control Aggregation getter and setter are designed
- why SAP Fiori action sheet is created as disabled by default
- SAP OData Multiple Origin composition test - Opportunity Creation case
- Cloud for Customer里employee视图打开时的渲染逻辑
- 列出系统所有未被Business transaction 引用的Products集合